1

2 つの jar ファイルがあります。1 つ目はインターフェースのみを含み、2 つ目はすべての実装クラスを含みます。アプリケーションの ear ファイルに最初の jar を含めたので、アプリケーションのデプロイ時にそのクラスがロードされます。

要求に基づいて、実行時に URLClassLoader を使用して、いくつかのフォルダーにある .jar ファイルから実装クラスをロードしようとしています。

クラスがロードされ、リフレクションを使用してクラスのインスタンスを作成していますが、.ear ファイルに含まれている jar ファイルに存在するインターフェイスにそのインスタンスをキャストしているときに、インターフェイス クラスの NoClassDefFoundError を取得しています。

これは、クラスをロードするために使用しているさまざまなクラス ローダーが原因であると確信していますが、クラス間の互換性の問題をどのように解決すればよいでしょうか。

同じコードは通常の J2SE 環境では機能しますが、JBoss camel コンテキストでは機能しません。

クエリが明確でない場合は、ソース コードも貼り付けることができることをお知らせください。

4

1 に答える 1

2

あなたの方法は JBossEAP 6 で動作するはずです。それは私が JBossAS7.1 で行ったことです。

class YourClassLoader extends URLClassLoader {
    ...
    public YourClassLoader() {
       this(YourClassLoader.class.getClassLoader());
       ...
       this.addURL(jarfile.toURI().toURL());
       ...
    }
    ...
}

Class<?> yourClass = yourClassLoader.loadClass(className);
YourClassInterface yourClassInterface = null;
yourClassInterface = (YourClassInterface ) yourClass.newInstance();

そして、同じ URLClassLoader でインターフェイス jar をロードしてみてください。

于 2013-03-07T07:24:15.390 に答える