3

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 ファイル クラスのクラスにアクセスできる外部ライブラリ モジュールを追加したいと考えています。

4

1 に答える 1

2

問題の解決策を見つけました。jboss-deployment-structure.xml とモジュールでしばらく遊んだ後、外部モジュールを使用したり、ear/war のクラスを拡張したりすることはできないことに気付きました。私の目標を達成するために、外部の場所にあるjarファイルを、earライブラリをロードする同じクラスローダーによってロードする必要がありました。これは、以下 (jboss-deployment-structure.xml) のように ear ファイルにリソースを直接追加することで実現できます。

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
<ear-subdeployments-isolated>false</ear-subdeployments-isolated>
<deployment>
    <dependencies>
        <module name="org.jboss.as.jmx"/>
        <module name="org.jboss.logmanager"/>
    </dependencies>
<resources>
    <resource-root path="../../../../../../../../../externalLib/externalLibrary-0.0.1-SNAPSHOT.jar" /> 
</resources>
</deployment>

<sub-deployment name="myservice.war">
</sub-deployment>
<sub-deployment name="admin.war">
</sub-deployment>   

resource-root パスは、standalone/deployments フォルダー内の ear ファイルに対する相対パスです。このようにリソース ルートを追加することは、ear ファイルの lib フォルダーにライブラリを追加することと同じです。したがって、これにより、すべてのフレームワーク ライブラリがある ear をロードするメイン クラスローダーの一部として、外部ライブラリも確実にロードされます。

于 2013-07-23T15:26:32.667 に答える