【问题标题】:Unable to resolve class loading issue with JBoss EAP 6.2无法解决 JBoss EAP 6.2 的类加载问题
【发布时间】:2014-08-15 16:59:15
【问题描述】:

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

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

按照 JBoss 的建议,策略是将这些 jar 加载为 模块

这是我们放置在 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 文档中没有记录。这只是解决方案,还是我的部署中存在其他一些问题,这使得它成为必要。还是bug?

【问题讨论】:

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


    【解决方案1】:

    JBoss 模块需要一个模块名称和一个插槽。在您的module.xml 中有一个可以使用的属性,称为slot,默认为main。由于您的module.xml 不在main 目录中,所以它什么也做不了。

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

    【讨论】:

    • 这有点道理,但应该记录在案。
    【解决方案2】:

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

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

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

    这花费了我将近一天的时间。

    【讨论】:

      猜你喜欢
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 2014-07-28
      • 1970-01-01
      • 2017-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多