【问题标题】:How to debug a incorrect module dependency in JBoss AS 7?如何在 JBoss AS 7 中调试不正确的模块依赖?
【发布时间】:2011-12-11 10:06:50
【问题描述】:

我有一个使用 Sun 的 MSV 库的网络应用程序。 MSV 的所有类都包含在 Web 应用程序 WEB-INF/lib 的 jar 中。在 JBoss 7 上部署此应用程序时,出现以下异常:

java.lang.NoClassDefFoundError: Could not initialize class com.sun.msv.datatype.xsd.AnyURIType
        at com.sun.msv.datatype.xsd.DatatypeFactory.getTypeByName(DatatypeFactory.java:195)
        at com.sun.msv.datatype.xsd.ngimpl.DataTypeLibraryImpl.getType(DataTypeLibraryImpl.java:32)
        at com.sun.msv.datatype.xsd.ngimpl.DataTypeLibraryImpl.createDatatypeBuilder(DataTypeLibraryImpl.java:36)
        at com.sun.msv.reader.trex.ng.DataState.startSelf(DataState.java:58)
        at com.sun.msv.reader.State.init(State.java:153)
        at com.sun.msv.reader.GrammarReader.pushState(GrammarReader.java:576)
        at com.sun.msv.reader.SimpleState.startElement(SimpleState.java:71)
        at org.xml.sax.helpers.XMLFilterImpl.startElement(XMLFilterImpl.java:527)
        at com.sun.msv.reader.trex.TREXBaseReader.startElement(TREXBaseReader.java:184)
        at com.sun.msv.reader.trex.ng.RELAXNGReader.startElement(RELAXNGReader.java:524)
        at com.sun.msv.reader.trex.ng.comp.RELAXNGCompReader.startElement(RELAXNGCompReader.java:197)
        at orbeon.apache.xerces.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:497)
        at orbeon.apache.xerces.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:180)
        at orbeon.apache.xerces.xinclude.XIncludeHandler.emptyElement(XIncludeHandler.java:1024)
        at orbeon.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:275)
        at orbeon.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(XMLDocumentFragmentScannerImpl.java:1654)
        at orbeon.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:324)
        at orbeon.apache.xerces.parsers.XML11Configuration.parse(XML11Configuration.java:845)
        at orbeon.apache.xerces.parsers.XML11Configuration.parse(XML11Configuration.java:768)
        at orbeon.apache.xerces.parsers.XMLParser.parse(XMLParser.java:108)
        at orbeon.apache.xerces.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1201)
        at com.sun.msv.reader.util.GrammarLoader._loadSchema(GrammarLoader.java:514)
        at com.sun.msv.reader.util.GrammarLoader.parse(GrammarLoader.java:325)
        at com.sun.msv.reader.util.GrammarLoader.loadSchema(GrammarLoader.java:189)
        at com.sun.msv.verifier.jarv.TheFactoryImpl.parse(TheFactoryImpl.java:42)
        at com.sun.msv.verifier.jarv.FactoryImpl.compileSchema(FactoryImpl.java:98)

它抱怨它找不到类com.sun.msv.datatype.xsd.AnyURIType,但该类存在于其中一个罐子中。我假设堆栈跟踪中的一些类是从来自 JBoss 的模块中“错误地”拾取的,因此是从另一个类加载器加载的,而不是从 Web 应用程序的 WEB-INF/lib 中的 jar 加载。但它可以是哪一个? (orbeon.apache.xerces 你看到有一个重新植根的 Apache Xerces 版本,所以我们可以确定它已经从 web 应用程序 jar 中加载。)我已经看到我可以排除 jboss-deployment-structure.xml 中的一些模块,如如下,但我应该排除哪一个?怎么查?

<jboss-deployment-structure>
    <ear-subdeployments-isolated>true</ear-subdeployments-isolated>
    <deployment>
        <exclusions>
            <module name="com.sun.xml.bind"/>
            <module name="org.codehaus.woodstox"/>
            <module name="org.codehaus.jackson.jackson-xc"/>
        </exclusions>
    </deployment>
</jboss-deployment-structure>

【问题讨论】:

  • 您可以在 jboss 社区forum 获得帮助,因为 AS7 是全新的。许多 JBoss 核心开发人员在社区站点中非常活跃。
  • 感谢您的建议。我在community.jboss.org/thread/173836上发布了这个问题,如果我通过JBoss论坛找到解决这个问题的方法,我会在这里跟进

标签: jboss osgi classloader jboss7.x


【解决方案1】:

您好,我不了解您的实际配置,但这是因为您在 xml 配置文件中进行了模块配置。我也遇到了这种错误,但我通过向服务器提供模块解决了它。所以你必须将你的库作为模块安装在你的服务器中。

添加模块 i.在应用服务器的根目录下,是一个名为modules的目录。创建自己的模块 例如jboss-7.0.0./modules/com/mysql/main ii.现在您需要使用 module.xml 文件定义您的模块,并在创建的文件夹中包含包含您的数据库驱动程序的实际 jar 文件。

  Modules
   +---com
   ¦   +---codehaus
   ¦   ¦    +---main
   ¦   ¦    +-------module.xml 
   ¦   ¦    +------<your jar file>

module.xml的内容应该如下:

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="<*module name*>">
 <resources>
 <resource-root path="<*jar name*>"/>
 <!-- Insert resources here -->
</resources>
<dependencies>
<module name="javax.api"/>
 <module name="javax.transaction.api"/>
</dependencies>
 </module>

Dependencies 用于声明你的模块对其他模块的依赖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-05
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    相关资源
    最近更新 更多