从 JBoss 7.1 引用依赖 Jar 文件时出错

Posted

技术标签:

【中文标题】从 JBoss 7.1 引用依赖 Jar 文件时出错【英文标题】:Error in Referencing a Dependency Jar File from JBoss 7.1 【发布时间】:2012-09-16 20:45:09 【问题描述】:

我根据 *** 问题here. 中提供的说明从 JBoss 7.1 模块引用了一个 jar 文件,我在 JBoss 5.x、6.x 中使用了这个 jar,没有任何问题。但是,当我尝试在 JBoss 7.1 中部署引用上述 jar 的 war 文件时,它给了我以下错误:

15:59:19,220 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].  [/Max_client]] (MSC service thread 1-2) StandardWrapper.Throwable: java.lang
NoClassDefFoundError: org/xml/sax/SAXException
    at com.systinet.wasp.webservice.ServiceClientImpl.lookup(ServiceClientImpl.java:556) [wasp.jar:]
    at com.systinet.wasp.webservice.ServiceClientImpl.createProxy(ServiceClientImpl.java:437) [wasp.jar:]
    at org.systinet.wasp.webservice.Registry.lookup(Registry.java:168) [wasp.jar:]
    at MyServlet.init(MyServlet.java:103)   at javax.servlet.GenericServlet.init(GenericServlet.java:242) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Fi
al]
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1202) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1102) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:3655) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:3873) [jbossweb-7.0.13.Final.jar:]
    at org.jboss.as.web.deployment.WebDeploymentService.start(WebDeploymentService.java:90) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811)
    at  org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746)
    at  java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [rt.jar:1.6.0_35]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [rt.jar:1.6.0_35]
    at java.lang.Thread.run(Thread.java:662) [rt.jar:1.6.0_35]
Caused by: java.lang.ClassNotFoundException: org.xml.sax.SAXException from [Module "commons.wasp:main" from local module loader @2adb1d4 (roots: c:\jboss-as-7.1.1
Final\modules)]
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:468)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:456)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:423)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398)
    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:120)
    ... 15 more 

我对 JBoss 7 中的这个新模块概念非常陌生。知道这里有什么问题吗?

谢谢!

我尝试做的详细信息:

我希望能够使这个依赖 jar 全局可用。所以我所做的是创建了一个文件夹结构 modules/common_libs/test/main 并将所需的 jar 放入其中。然后创建了模块描述符module.xml:

<module xmlns="urn:jboss:module:1.1" name="common_libs.test">
    <resources>
        <resource-root path="test.jar"/>
    </resources>
</module>

然后在我需要访问这个 jar 的应用程序中,我在 MANIFEST.MF 中添加:

Dependencies: common_libs.test

应用程序是一个war文件,我将它部署在deployment文件夹下,并创建了一个.war.dodeploy文件。启动 JBoss 服务器时出现此异常。

任何想法,任何人?

谢谢!

【问题讨论】:

你能解释一下你做了什么吗?您是否正在尝试创建一个全局共享的模块? 【参考方案1】:

您需要查看您的模块所需的依赖项。根据当前的错误消息,它看起来需要对 SAX 的依赖。您可能应该将 javax.api(这是 SAX 所在的模块)的依赖项添加到您的 module.xml。

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="common_libs.test">
    <resources>
        <resource-root path="test.jar"/>
    </resources>

    <dependencies>
        <module name="javax.api"/>
    </dependencies>
</module>

您需要为共享库所需的任何依赖项添加依赖项。

【讨论】:

【参考方案2】:

在您的 module.xml 中添加对 javax.api 的依赖项,它应该可以工作。

正如你提到的,你是这个模块概念的新手。很少解释我们在做什么。 使用 JBoss AS7x 架构,我们使用模块为我们的应用程序提供 jars/类。其中之一是它减轻了战争。

我们为我们的 jars 创建模块,module.xml 是一个描述符,它充当模块的 ID/bio,告诉服务器其中有什么 &lt;resources&gt; 标签

以及这个模块依赖于什么 &lt;dependencies&gt;标签

对于我们大部分的模块,我们添加了对 javax.api 的依赖,以便模块可以编译。为什么?想不起来要注意了。并在您知道时添加为评论。

希望这会有所帮助:-)

【讨论】:

还有一个问题。我设法将 jar 打包到模块中。但是,当我尝试访问部署在 localhost 中的 Web 服务时,获取 WSDL 定义消息时出现错误。我可以通过浏览器访问 WSDL,以及我在 JBoss 5.x 和 6.x 中使用的相同客户端代码以及托管在 localhost 中的相同服务,而不会出现此类错误。我需要在 JBoss 7 中进行任何其他配置以通过 servlet 访问 Web 服务吗? 不需要特定的配置。应该是一些类路径问题。您的 ejb.jar 在您的 web-inf/lib 中吗?你能从控制台提供确切的堆栈 n 错误吗?如果可以的话,我可以提供更多帮助。问候 这是我得到的服务查找异常,即使 Web 服务已经启动并且可以通过浏览器/另一个客户端访问。我在JBoss的早期版本中也没有将ejb.jar添加到WEB-INF/lib中,为什么我必须这样做? 不确定为什么我们需要 lib 中的 ejb.jar。我自己也曾遇到过类似的问题,从 JBossCommunity 的一些人那里得到了帮助,并被告知将 ejb.jar 添加到库中(原因是:需要创建 web 服务端点)。请尝试将其添加到您的库中,看看它是否有效。问候

以上是关于从 JBoss 7.1 引用依赖 Jar 文件时出错的主要内容,如果未能解决你的问题,请参考以下文章

JBOSS AS 7.1 JBAS014775:新的缺失/不满足的依赖项:

在 JBoss 7.1 中使用 log4j

从 JBoss AS 7.1 迁移到 JBoss EAP 7.3.0

从Jboss EAP 6.4迁移到EAP 7.1

在 Jboss 7.1 上部署 datasource.xml

EJB远程客户端从JBoss AS 7.1迁移到Wildfly 8.1