无法解决JBoss EAP 6.2的类加载问题

时间:2014-08-15 16:59:15

标签: jboss7.x classloader jboss-eap-6

(请参阅最后更新。它定义了一种解决方法,但该解决方法也引发了一些问题。)

我们正在尝试从WebLogic将应用程序移植到JBoss EAP 6.2。一路上会遇到很多困难,但现在我只想尝试移植一个war文件,并且我在脚本上加载问题。这场战争取决于它不包括的两个罐子。在Web Logic中,这些jar位于服务器的类路径中。无论继续这种模式是否有意义,目前的努力都是这样做的。但我无法让它发挥作用。

该策略将这些jar加载为模块,正如JBoss所建议的那样。

这是我们放在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 /不管/ 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定义的系统模块中,模块定义和模块本身位于... / {module name} / main目录中,而不是... / {module name}目录。 / p>

在我的模块中遵循此模式,战争现在成功加载。

但是,这还有问题吗?为什么这个“主要”子目录似乎需要?它没有记录在JBoss文档中。这只是解决方案,还是我的部署中存在其他一些有问题的方面,这使得它成为必要。或者这是一个错误?

2 个答案:

答案 0 :(得分:2)

JBoss模块需要模块名称和插槽。在module.xml中,有一个名为slot的属性,默认为main。由于您的module.xml不在main目录中,因此无法解决问题。

换句话说,通用目录格式为package/name/slot。由于默认插槽为main,因此JBoss模块在com/whatever/ivss/main中查找了module.xml文件。

答案 1 :(得分:1)

进一步调查显示这是一个相当严重的文档错误。我已将此发布为JBoss bugzilla上的错误:

https://bugzilla.redhat.com/show_bug.cgi?id=1130642

还有一些其他jboss文档与我正在阅读的文档相矛盾,详细信息在bug报告中。

这让我花了近一天的时间来抓头。