2
jarを作成しようとしましたが、コンパイルに使用しますが、jarを出荷しません。私は、ユーザーがjarを提供し、このjarに私のアプリケーションを向けることを期待しています。Thread.currentThread()。setContextClassLoaderが正しく動作しないようです。
は、次のことを想像してみて:
これは私のソースツリーです:
main.jar
main
Main.class
test.jar
test
Test.class
私のソースは次のようになります:
メイン
main
Main.java
test
Test.java
私は2つのjarファイルを作成します。 java
package main;
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import test.Test;
public class Main {
public static void main(String[] args) throws Exception {
URLClassLoader urlClassLoader = new URLClassLoader(new URL[] { new File("test.jar").toURI().toURL() }, null);
Thread.currentThread().setContextClassLoader(urlClassLoader);
Test.test();
}
}
Test.java
package test;
public class Test {
public static void test() {
System.out.println("Hello world!");
}
}
私は、しかし、クラスパス上のtest.jarなしmain.jarを呼び出します。 URLClassLoaderにtest.jarをロードすると、とプログラムはHello world!。
しかし、URLClassLoaderではなくシステムクラスローダーを使用しているようです。私は得る:
Exception in thread "main" java.lang.NoClassDefFoundError: test/Test
at main.Main.main(Main.java:14)
Caused by: java.lang.ClassNotFoundException: test.Test
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)
... 1 more
私の間違いは何ですか?どのようにそれを正しく行うには?答えをお探しの方に
'NoClassDefFoundError'はワットThread.contextClassLoader'' /は全く関係ありません。 VMによってクラスをロードするときには、現在のクラスのクラスローダー – bestsss
を使用して、Class.forName( "... Test"、true、classloader)によって問題ロードクラスTestを解決し、リフレクションによってtest()を呼び出します。それからあなたはあなたが必要とするものを多かれ少なかれ得るでしょう。 – bestsss
はい、私はそれを反映させることができることを認識しています。しかし、私が達成しようとしているのは反射を使用しないことです。 contextClassLoaderがここで使用されていないというヒントは良いですが、質問は開いたままです...効果を達成する方法がまだ分かりません。 – Arne