(请参阅最后的更新。它定义了一种解决方法,但该解决方法也提出了问题)。
我们正在尝试将应用程序从 WebLogic 移植到 JBoss EAP 6.2。一路上会有很多困难,但现在我只是试图移植一个单一的战争文件,而且我在类加载问题上遇到了麻烦。这场战争取决于它不包括的两个罐子。在 Web Logic 中,这些 jar 文件位于服务器的类路径中。无论继续这种模式是否有意义,目前的努力都是这样做的。但我无法让它工作。
正如 JBoss 建议的那样,策略是将这些 jar 加载为modules 。
这是我们放置在 war 文件的 WEB-INF 目录中的 jboss-deployment-structure.xml 文件,再次按照 Jboss 的建议:
<?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
这里是上面提到的两个 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在那里做什么?我从来没有要求我的模块被“main”这个词所限定。
再看一点,我沿着 JBOSS_EAP_HOME/modules/system 目录的树向下走。这些是 JBoss 提供的出厂默认依赖模块。这里的每个模块都有自己的 module.xml 和 jar 文件,位于名为 main 的子目录中。例如:
[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定义的系统模块中,模块定义和模块本身都位于.../{module name}/main目录下,而不是.../{module name}目录下。
按照我的模块中的这种模式,战争现在成功加载。
然而,这仍然留下一个问题?为什么这个“主”子目录似乎是必需的?JBoss 文档中没有记录。这只是解决方案,还是我的部署中存在其他一些问题,这使得它成为必要。或者它是一个错误?