ear ファイルを持つ JBoss サーバーがあります。私のearファイルにはwarファイルがあります。warファイルにはjarファイル「server-artifact.jar」があります。サーバーのサービス エンドポイントはその jar にあります。jar ファイル内のクラスは、クラスを動的にロードしてアクションを実行します。
Class<?> clazz = (Class<?>) Class.forName("com.test.TestExternalAccess");
try {
TestExternalAccessParent extClassObject = (TestExternalAccessParent) clazz.newInstance();
extClassObject.sayHelloToExternalAccess();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
インターフェイスである「TestExternalAccessParent」を含むjarファイルもwarファイルの一部です。クラス「TestExternalAccess」は、サーバーのプラグ可能なユニットになることを目的とした具象クラスです。これを実現するために、jboss モジュールを作成し、modules フォルダーに配置しました (どのように? ):
<module xmlns="urn:jboss:module:1.1" name="com.test">
<resources>
<resource-root path="externalLibrary-0.0.1-SNAPSHOT.jar"/>
</resources>
</module>
また、jboss-deployment-structure.xml を編集し
<module name="com.test" />
、サーバーを起動して実行する依存関係を追加しました。クラスの動的ロードが発生すると、次の例外が発生します。
java.lang.ClassNotFoundException: com.test.TestExternalAccess from [Module "deployment.myservice-ear.ear:main" from Service Module Loader]
私が試したいくつかのこと:1)メインearファイルのjarファイルにインターフェースを実装せず、正常に動作する外部モジュールからクラスをロードしようとしました。2)インターフェースを含むjarファイルを含めるようにモジュールを変更しました。
<module xmlns="urn:jboss:module:1.1" name="com.test">
<resources>
<resource-root path="externalLibrary-0.0.1-SNAPSHOT.jar"/>
<resource-root path="externalParentLibrary-0.0.1-SNAPSHOT.jar"/>
</resources>
</module>
それもうまくいきます。3)私のモジュールに次の依存関係を追加しました:
<dependencies>
<module name="deployment.myservice-ear.ear"/>
</dependencies>
それは機能しません。
私の耳をロードしたクラスローダーは、別のクラスローダーを使用して外部モジュールをロードし、そのモジュール内のクラスにアクセスします。しかし、私の外部モジュールのクラスは耳の jar にアクセスできないようです。どうすればこれを実現できますか? サーバーの ear ファイル クラスのクラスにアクセスできる外部ライブラリ モジュールを追加したいと考えています。