.jarファイルに含まれるクラスを動的にロードしようとしています。私はクラス名全体を知っています。クラスがAlgorithmClassインタフェースを実装していることが分かります。 私のコードは次のようになります。dirは.jarファイルとaddURLToSystemClassLoader(URL)のFileオブジェクトですglassfishでクラスを動的にロードしようとしたときにjava.lang.ClassNotFoundExceptionが発生しました
addURLToSystemClassLoader(dir.toURI().toURL());
Class cl = Class.forName(algorithm.getClassName());
AlgorithmClass algorithmClass = (AlgorithmClass)cl.newInstance();
は次のようになります。
private void addURLToSystemClassLoader(URL url) throws IntrospectionException {
URLClassLoader systemClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Class<URLClassLoader> classLoaderClass = URLClassLoader.class;
try {
Method method = classLoaderClass.getDeclaredMethod("addURL", new Class[]{URL.class});
method.setAccessible(true);
method.invoke(systemClassLoader, new Object[]{url});
} catch (Throwable t) {
t.printStackTrace();
throw new IntrospectionException("Error when adding url to system ClassLoader ");
}
}
私がチェックし、URLがされていますクラスローダーに追加されます。
私はClassオブジェクトを取得しようとすると、私はエラーを取得する:
SEVERE:javax.servlet.ServletException:java.lang.ClassNotFoundExceptionが:id3.Algorithm
(id3.Algorithmがあります私はロードしようとしているクラスのフルネーム)
私は以下のような新しいクラスローダを作成しようとしました:
ClassLoader cload = new URLClassLoader(new URL[]{dir.toURI().toURL()}, ClassLoader.getSystemClassLoader());
Class cl = Class.forName(algorithm.getClassName(), false, cload);
AlgorithmClass algorithmClass = (AlgorithmClass)cl.newInstance();
しかし、私はエラーを取得する:
ます。java.lang.NoClassDefFoundError:libに/アルゴリズム/ AlgorithmClass
私はシステムクラスローダーが持っているすべてのURLを持つ新しいURLClassLoaderのが、効果を作成しようとしました同じだった。
"最悪"の部分は、コードのこの部分をテストするために持っているjUnitテストで両方の方法が完全に正常に動作していることです。
私はAppsサーバーとしてGlassfish 3.1.1を使用しています。
あなたは何を意味するのjarは、このコードの実行 –
@Luiggiメンドーサよりも前にロードされていることを確認してください?このコードの全体的なポイントは、コードのその部分にクラスを動的にロードすることです。 – kemaleq
アプリケーションサーバーがアプリケーションをデプロイするときに、jars(ide *が含まれているものも含む)が見つかり、それらのすべてがwarコードのコンパイル前に配置されていることを確認する必要があります。 –