2012-05-07 17 views
1

.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を使用しています。

+0

あなたは何を意味するのjarは、このコードの実行 –

+0

@Luiggiメンドーサよりも前にロードされていることを確認してください?このコードの全体的なポイントは、コードのその部分にクラスを動的にロードすることです。 – kemaleq

+0

アプリケーションサーバーがアプリケーションをデプロイするときに、jars(ide *が含まれているものも含む)が見つかり、それらのすべてがwarコードのコンパイル前に配置されていることを確認する必要があります。 –

答えて

1

ディレクトリには 'lib'を含めないでください。 これを試してみてください:

ClassLoader cload = new URLClassLoader(new URL[]{dir.toURI().toURL()}, Thread.currentThread().getContextClassLoader()); 
Class cl = Class.forName(algorithm.getClassName(), true, cload); 
AlgorithmClass algorithmClass = (AlgorithmClass)cl.newInstance(); 
+0

それは魅力として働いた。どうもありがとうございます! – kemaleq

0

あなたはクラスローディングの問題があります。あなたはaddURLToSystemClassLoader()が実際にあなたのお尻であることに気づくでしょう。

あなたの瓶をクラスパスに入れてください。慣用名Class.forName()を使用してください。それはparammeterクラスローダパラメータとしてすなわち

public static Class<?> forName(String name, boolean initialize, 
           ClassLoader loader) 

とパスThread.currentThread().getContextClassLoader()としてClassLoaderを受けるバージョンを使用して失敗した場合。

下記の私の別の回答も参照してください。

関連する問題