我正在运行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 回答
尝试变体3,但是将依赖项添加到依赖项我假设您尝试使用来自ejb或war的javax.xml.parsers.SAXParserFactory.newInstance() . 子部署没有看到耳朵的依赖模块 . 您必须明确导出 .
问题最终是包含试图加载SAXParserFactoryImpl的EJB的线程的类加载器无法访问它 . 为了解决这个问题,我必须找到一个具有SAXParserFactoryImpl可见性的类加载器的线程(碰巧在我的MDB上)并在有问题的bean上手动设置它 . 我从来没有确定发生了什么,但这是一个快速而肮脏的工作 .
经过很多RND终于找到了解决方案 . 这是:
1)复制你的XercesImpl-Xxxjar并将其粘贴到/ jre / lib /中: - 对我来说 - > C:\ Program Files \ Java \ jdk1.8.0_131 \ jre \ lib 2)在lib里面创建一个新的文件夹"endorsed" . 3)将jar文件粘贴到“ endorsed ”文件夹中4)重新启动服务器,xerces地狱已经消退 .
如果解决方案适合您,请告诉我 .