2011-08-05 159 views
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 

我的錯誤是什麼?如何做到這一點?

+1

'NoClassDefFoundError'絕對沒有做W /'Thread.contextClassLoader'。當由VM加載一個類時,它使用當前類的類加載器 – bestsss

+1

,以通過Class.forName(「... Test」,true,classloader)來解決問題加載類Test,並通過反射調用test()。那麼你會得到或多或少你需要的東西。 – bestsss

+0

是的,我知道我可以通過反思做到這一點。但我試圖達到的不是使用反射。 contextClassLoader在這裏沒有被使用的提示很好......但問題仍然存在......仍然不確定如何達到效果。 – Arne

回答

相關問題