(最後の更新を参照してください。回避策が定義されていますが、その回避策にも疑問が生じます)。
アプリケーションを WebLogic から JBoss EAP 6.2 に移植しようとしています。途中で多くの困難が待ち構えていますが、今はただ 1 つの war ファイルを移植しようとしており、クラスローディングの問題に頭を悩ませています。この戦争は、含まれていない 2 つの jar に依存しています。Web Logic では、これらの jar はサーバーのクラスパスにありました。このパターンを続けることが理にかなっているかどうかにかかわらず、現在の取り組みはそうすることにあります。しかし、私はそれを機能させることができません。
JBoss が推奨するように、戦略はこれらの jar をモジュールとしてロードすることです。
これは、Jboss が推奨するように、war ファイルの WEB-INF ディレクトリに配置する jboss-deployment-structure.xml ファイルです。
<?xml version="1.0"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<deployment>
<dependencies>
<module name="com.whatever.ivss" export="TRUE"/>
<module name="com.whatever.vt.svcauthentication" export="TRUE"/>
</dependencies>
</deployment>
</jboss-deployment-structure>
jboss に従って、次のように、これらの jar と module.xml 記述子を {JBOSS_EAP_HOME} /modules の下のディレクトリ構造にデプロイします。
$ pwd
/.../jboss-eap-6.2/modules/com/whatever
$ ls -alR
.:
total 16
drwxrwxr-x. 4 wevs wevs 4096 Aug 14 14:58 .
drwxrwxr-x. 4 wevs wevs 4096 Aug 13 14:07 ..
drwxrwxr-x. 2 wevs wevs 4096 Aug 15 09:44 ivss
drwxrwxr-x. 3 wevs wevs 4096 Aug 14 14:58 vt
./ivss:
total 132
drwxrwxr-x. 2 wevs wevs 4096 Aug 15 09:44 .
drwxrwxr-x. 4 wevs wevs 4096 Aug 14 14:58 ..
-rw-r-----. 1 wevs wevs 121414 Aug 13 14:22 ivsslib-jdk1.5.jar
-rw-r-----. 1 wevs wevs 356 Aug 15 09:44 module.xml
./vt:
total 12
drwxrwxr-x. 3 wevs wevs 4096 Aug 14 14:58 .
drwxrwxr-x. 4 wevs wevs 4096 Aug 14 14:58 ..
drwxrwxr-x. 2 wevs wevs 4096 Aug 14 15:02 svcauthentication
./vt/svcauthentication:
total 24
drwxrwxr-x. 2 wevs wevs 4096 Aug 14 15:02 .
drwxrwxr-x. 3 wevs wevs 4096 Aug 14 14:58 ..
-rw-r-----. 1 wevs wevs 306 Aug 14 15:02 module.xml
-rw-r-----. 1 wevs wevs 11524 Aug 13 14:21 svcauthentication-jdk1.5.jar
上記の 2 つの module.xml ファイルは次のとおりです。
.../com/whatever/ivss/module.xml:
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="com.whatever.ivss">
<resources>
<resource-root path="ivsslib-jdk1.5.jar"/>
</resources>
<dependencies>
<module name="javax.jms.api"/>
<module name="javax.servlet.api"/>
<module name="org.apache.log4j"/>
<module name="system"/>
</dependencies>
</module>
および .../com/whatever/vt/svcauthentication/module.xml:
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="com.whatever.vt.svcauthentication">
<resources>
<resource-root path="svcauthentication-jdk1.5.jar"/>
</resources>
<dependencies>
<module name="com.whatever.ivss"/>
<module name="system"/>
</dependencies>
</module>
私が識別できた限り、私はすべてを正しく行いました。
それでも、クラスはロードを拒否し、jboss ログ (トレース レベル) を見ると、エラーはモジュールを見つけることができないようです (ダウンストリーム クラスの依存関係の問題ではありません):
10:12:07,254 DEBUG [org.jboss.modules] (MSC service thread 1-4) Module deployment.dbAccess.war:main defined by Service Module Loader
10:12:07,254 TRACE [org.jboss.modules] (MSC service thread 1-4) Loaded module deployment.dbAccess.war:main from Service Module Loader
10:12:07,256 TRACE [org.jboss.modules] (MSC service thread 1-4) Locally loading module com.whatever.ivss:main from local module loader @65c404b3 (finder: local modul
e finder @2810b7f7 (roots: .../jboss-eap-6.2/modules,.../jboss-eap-6.2/modules/system/layers/base))
10:12:07,256 TRACE [org.jboss.modules] (MSC service thread 1-4) Module com.whatever.ivss:main not found from local module loader @65c404b3 (finder: local module find
er @2810b7f7 (roots: .../jboss-eap-6.2/modules,.../jboss-eap-6.2/modules/system/layers/base))
...
10:12:07,256 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-4) MSC000001: Failed to start service jboss.module.service."deployment.dbAccess.war".main:
org.jboss.msc.service.StartException in service jboss.module.service."deployment.dbAccess.war".main: JBAS018759: Failed to load module: deployment.dbAccess.war
:main
at org.jboss.as.server.moduleservice.ModuleLoadService.start(ModuleLoadService.java:91) [jboss-as-server-7.3.0.Final-redhat-14.jar:7.3.0.Final-redhat-14
]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.4.GA-redhat-1.jar:1.0.4.GA-redhat-
1]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.4.GA-redhat-1.jar:1.0.4.GA-redhat-1]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_51]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_51]
at java.lang.Thread.run(Thread.java:744) [rt.jar:1.7.0_51]
Caused by: org.jboss.modules.ModuleNotFoundException: com.whatever.ivss:main
at org.jboss.modules.Module.addPaths(Module.java:1030) [jboss-modules.jar:1.3.0.Final-redhat-2]
at org.jboss.modules.Module.link(Module.java:1386) [jboss-modules.jar:1.3.0.Final-redhat-2]
at org.jboss.modules.Module.relinkIfNecessary(Module.java:1414) [jboss-modules.jar:1.3.0.Final-redhat-2]
at org.jboss.modules.ModuleLoader.loadModule(ModuleLoader.java:242) [jboss-modules.jar:1.3.0.Final-redhat-2]
at org.jboss.as.server.moduleservice.ModuleLoadService.start(ModuleLoadService.java:70) [jboss-as-server-7.3.0.Final-redhat-14.jar:7.3.0.Final-redhat-14
]
... 5 more
私は何か間違ったことをしているに違いありませんが、それが何であるかわかりません。JBoss がモジュールを見つけられないのはなぜですか?
アップデート:
これに対する可能な解決策を見つけたか、それは単なる応急処置である可能性があります。
最初の手がかりは、上記のログ エントリでした。
Locally loading module com.whatever.ivss:main ...
:mainはそこで何をしているのですか? モジュールを「メイン」という用語で修飾するように要求したことは一度もありません。
もう少し調べてみると、JBOSS_EAP_HOME/modules/system ディレクトリのツリーをたどりました。これらは、JBoss が提供する工場出荷時のデフォルトの依存モジュールです。ここにあるすべてのモジュールには、main というサブディレクトリ内に module.xml ファイルと jar ファイルがあります。例えば:
[wevs@hdcas01 cal10n]$ pwd
.../jboss-eap-6.2/modules/system/layers/base/ch/qos/cal10n
[wevs@hdcas01 cal10n]$ ls -alR
.:
total 12
drwxrwxr-x. 3 wevs wevs 4096 Nov 20 2013 .
drwxrwxr-x. 3 wevs wevs 4096 Nov 20 2013 ..
drwxrwxr-x. 2 wevs wevs 4096 Nov 20 2013 main
./main:
total 44
drwxrwxr-x. 2 wevs wevs 4096 Nov 20 2013 .
drwxrwxr-x. 3 wevs wevs 4096 Nov 20 2013 ..
-rw-rw-r--. 1 wevs wevs 30262 Nov 20 2013 cal10n-api-0.7.3-redhat-2.jar
-rw-rw-r--. 1 wevs wevs 1419 Nov 20 2013 module.xml
つまり、JBoss が定義するシステム モジュールでは、モジュール定義とモジュール自体が .../{モジュール名} ディレクトリではなく、.../{モジュール名}/main ディレクトリに配置されます。
私のモジュールでこのパターンに従って、戦争が正常にロードされるようになりました。
しかし、これにはまだ疑問が残りますか?この「メイン」サブディレクトリが必要なように見えるのはなぜですか? JBoss ドキュメントには記載されていません。これは単なる解決策ですか、それとも私の展開にそれを必要とする問題のある側面がありますか? それともバグですか?