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

私の間違いは何ですか?どのようにそれを正しく行うには?答えをお探しの方に

+1

'NoClassDefFoundError'はワットThread.contextClassLoader'' /は全く関係ありません。 VMによってクラスをロードするときには、現在のクラスのクラスローダー – bestsss

+1

を使用して、Class.forName( "... Test"、true、classloader)によって問題ロードクラスTestを解決し、リフレクションによってtest()を呼び出します。それからあなたはあなたが必要とするものを多かれ少なかれ得るでしょう。 – bestsss

+0

はい、私はそれを反映させることができることを認識しています。しかし、私が達成しようとしているのは反射を使用しないことです。 contextClassLoaderがここで使用されていないというヒントは良いですが、質問は開いたままです...効果を達成する方法がまだ分かりません。 – Arne

答えて