5.19. モジュールクラスローティングの変更
JBoss EAP 7 では、複数のモジュールに同じクラスまたはパッケージが含まれる場合のクラスローディングの動作が変更になりました。
お互いに依存し、一部同じパッケージが含まれる MODULE_A
と MODULE_B
の 2 つのモジュールがあるとします。JBoss EAP 6 では、依存関係からロードされたクラスまたはパッケージは module.xml
ファイルの resource-root
に指定されたものよりも優先されました。これは、MODULE_A
は MODULE_B
のパッケージを認識し、MODULE_B
は MODULE_A
のパッケージを認識したことを意味します。この動作は複雑で競合が発生することがありました。この動作は JBoss EAP 7 では変更になりました。module.xml
ファイルの resource-root
で指定されたクラスまたはパッケージは、依存関係で指定されたものよりも優先されるようになりました。これは MODULE_A
が MODULE_A
のパッケージを認識し、MODULE_B
は MODULE_B
のパッケージを参照します。これにより、競合を回避し、動作が安定します。
resource-root
ライブラリーが含まれるカスタムモジュールまたは複製されたクラスがモジュール依存関係に含まれるパッケージを定義した場合、JBoss EAP 7 へ移行するときに ClassCastException
、LinkageError
、クラスローディングエラー、またはその他の動作の変更が発生することがあります。この問題を解決するには、module.xml
ファイルを設定して 1 つのバージョンのクラスのみが使用されるようにする必要があります。これは、以下の方法の 1 つを使用して実現できます。
-
モジュール依存関係のクラスを複製する
resource-root
を指定しないようにします。 imports
およびexports
要素のinclude
およびexclude
サブ要素を使用してmodule.xml
ファイルでクラスローディングを制御できます。以下は、指定されたパッケージでクラスを除外する export 要素になります。<exports> <exclude path="com/mycompany/duplicateclassespath/"/> </exports>
既存の動作を保持するには、filter
要素を使用して module.xml
ファイルの依存する resource-root
から依存パッケージをフィルターする必要があります。これにより、JBoss EAP 6 で見られる odd loop なしで既存の動作を保持できます。以下は、指定のパッケージのクラスをフィルターする root-resource
の例になります。
<resource-root path="mycompany.jar"> <filter> <exclude path="com/mycompany/duplicateclassespath"/> </filter> </resource-root>
モジュールおよびクラスローディングの詳細は、JBoss EAP『開発ガイド』の「クラスローディングとモジュール」を参照してください。