このようなリフレクションを使用して別のjarファイルを呼び出していますmainMethod.invoke(null, new Object[] { passargs });
(基本的なもの)。ほとんどのjarファイルで機能しますが、ClassNotFoundException
. そのjarで定義された新しいオブジェクトを作成している外部jarのコードの最初の行でエラーが発生しています(ただし、他のクラスは独自のjarクラスを正常にロードします)。jar の main メソッドの最初の行でエラーが発生しているため、カスタム クラスローダーを使用しているとは思えません。
別のjarのメインメソッドを呼び出すときに ClassNotFoundException を引き起こす可能性のあるアイデアはありますか? これは、他の多くの複雑な jar で機能します。そのうちの 1 つだけが機能していません。何が原因なのだろうかと考えています。で個別に実行すると正常に動作しますjava -jar
//my jar
JarFile jar = new JarFile(load);
Attributes attributes = jar.getManifest().getMainAttributes();
String mainClass = attributes.getValue("Main-Class");
URLClassLoader cl = new URLClassLoader(new URL[] { new File(load).toURI().toURL() }, ClassLoader.getSystemClassLoader());
Class main = cl.loadClass(mainClass);
System.out.println("MAIN CLASS: " + mainClass);
Method mainMethod = main.getDeclaredMethod("main", new Class[] { String[].class });
mainMethod.invoke(null, new Object[] { new String[0] });
この行で例外をスローします(他のjar - 呼び出されているもの)
public static void main(String[] args) throws Exception {
LoadingScreen ls = new LoadingScreen();
例外:
Exception in thread "main" java.lang.NoClassDefFoundError: org/spoutcraft/launcher/gui/LoadingScreen
at org.spoutcraft.launcher.Main.main(Main.java:106)
at com.mineshaftersquared.MineshafterSquaredGUI.wrapJar(Driver.java:110)
at com.mineshaftersquared.resources.ServerProxy.main(ServerProxy.java:71)
Caused by: java.lang.ClassNotFoundException: org.spoutcraft.launcher.gui.LoadingScreen
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 3 more