2
我尝试创建一个jar,使用它进行编译,但不运行该jar。我期望用户提供jar并将我的应用程序指向这个jar。Thread.currentThread()。setContextClassLoader似乎不能正常工作
想象一下以下内容:
这是我的源代码树:
main
Main.java
test
Test.java
我创建两个罐子:
main.jar
main
Main.class
test.jar
test
Test.class
我的来源是这样的:
主。 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!");
}
}
我叫main.jar文件但没有Test.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'绝对没有做W /'Thread.contextClassLoader'。当由VM加载一个类时,它使用当前类的类加载器 – bestsss
,以通过Class.forName(“... Test”,true,classloader)来解决问题加载类Test,并通过反射调用test()。那么你会得到或多或少你需要的东西。 – bestsss
是的,我知道我可以通过反思做到这一点。但我试图达到的不是使用反射。 contextClassLoader在这里没有被使用的提示很好......但问题仍然存在......仍然不确定如何达到效果。 – Arne