首页 文章

ClassNotFound:在Wildfly 8.2中运行时Xerces SAXParserFactoryImpl

提问于
浏览
0

我正在运行Wildfly 8.2.0并进行一些XML Config文件解析 . 我的想法是,我将能够使用捆绑的xercesImpl.jar来提供JAXP SAXParserFactoryImpl .

在Wildfly外部运行逻辑时,我成功地能够使用SAXParserFactoryImpl进行解析 . 通过设置系统属性找到此工厂:

System.setProperty("javax.xml.parsers.SAXParserFactory",
                   "org.apache.xerces.jaxp.SAXParserFactoryImpl");
SAXParserFactory factory = javax.xml.parsers.SAXParserFactory.newInstance();

部署我的EAR后,我收到以下错误:

...: javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.SAXParserFactoryImpl not found.
..
..
...: Caused by: java.lang.ClassNotFoundException: org/apache/xerces/jaxp/SAXParserFactoryImpl
..
..

知道Wildfly从wildfly / modules / system / layers / base / org / apache / xerces / main / xercesImpl-2.9.1-jbossas2.jar运行自己的Xerces,我尝试了以下方法:

[1] Use Wildfly's xercesImpl-2.9.1-jbossas2.jar ... no change

(来源:jboss-deployment-structure.xml的Wildfly文档)

在jboss-deployment-structure.xml中:

<jboss-deployment-structure>
    <ear-subdeployments-isolated>false</ear-subdeployments-isolated>
    <deployment>
        ...
    </deployment>
</jboss-deployment-structure>

EARContent:

lib/
    ...(removed xercesImpl.jar)...
META-INF/
    application.xml // Information about EJB that uses xercesImpl.jar
    jboss-deployment-structure.xml

[2] Ignore Wildfly's xercesImpl-2.9.1-jbossas2.jar ... no change

(来源:https://developer.jboss.org/thread/259010?start=0&tstart=0

在jboss-deployment-structure.xml中:

<jboss-deployment-structure>
    <ear-subdeployments-isolated>true</ear-subdeployments-isolated>
    <deployment>
        <exclusions>
            <module name="org.apache.xerces" />
        </exclusions>
        ...
    </deployment>
</jboss-deployment-structure>

EARContent:

lib/
    xercesImpl.jar
    ...(many more jars)...
META-INF/
    application.xml // Information about EJB that uses xercesImpl.jar
    jboss-deployment-structure.xml

[3] Explicitly include Wildfly's xerces as a module ... no change

(来源:https://developer.jboss.org/thread/239969

在jboss-deployment-structure.xml中:

<jboss-deployment-structure>
    <ear-subdeployments-isolated>false</ear-subdeployments-isolated>
    <deployment>
        <dependencies>  
              <module name="org.apache.xerces" /> 
              ...
        </dependencies>  
    </deployment>
</jboss-deployment-structure>

EARContent:

lib/
    ...(removed xercesImpl.jar)...
META-INF/
    application.xml // Information about EJB that uses xercesImpl.jar
    jboss-deployment-structure.xml

[4] Declare Java property for JAXP Parser ... no change

启动Wildfly时:

./standalone.sh -c standalone-full.xml -Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl

在standalone-full.xml中

<system-properties>
    <property name="javax.xml.parsers.SAXParserFactory" value="org.apache.xerces.jaxp.SAXParserFactoryImpl"/>
</system-properties>

(注意:尝试尝试此属性[1],[2],[3])

[5] Adding Xerces Path to jboss-deployment-structure ... no change

(来源:developer.jboss.org/message/717927#717927)

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
    <deployment>
        <dependencies>
            <system>
                <paths>
                    <path name="org/apache/xerces/jaxp"/>
                </paths>
            </system>
            ...
        </dependencies>
    </deployment>
</jboss-deployment-structure>

3 回答

  • 0

    尝试变体3,但是将依赖项添加到依赖项我假设您尝试使用来自ejb或war的javax.xml.parsers.SAXParserFactory.newInstance() . 子部署没有看到耳朵的依赖模块 . 您必须明确导出 .

  • 0

    问题最终是包含试图加载SAXParserFactoryImpl的EJB的线程的类加载器无法访问它 . 为了解决这个问题,我必须找到一个具有SAXParserFactoryImpl可见性的类加载器的线程(碰巧在我的MDB上)并在有问题的bean上手动设置它 . 我从来没有确定发生了什么,但这是一个快速而肮脏的工作 .

  • 0

    经过很多RND终于找到了解决方案 . 这是:

    1)复制你的XercesImpl-Xxxjar并将其粘贴到/ jre / lib /中: - 对我来说 - > C:\ Program Files \ Java \ jdk1.8.0_131 \ jre \ lib 2)在lib里面创建一个新的文件夹"endorsed" . 3)将jar文件粘贴到“ endorsed ”文件夹中4)重新启动服务器,xerces地狱已经消退 .

    如果解决方案适合您,请告诉我 .

相关问题