JDK6和xml-apis之间的冲突

时间:2015-03-27 19:06:43

标签: java weblogic classloader xerces opensaml

将OpenSAML从1.1升级到2.6.1后,需要xerces-impl依赖,启动时会出现以下堆栈:

 Caused by: java.lang.ClassCastException: org.apache.xerces.jaxp.datatype.DatatypeFactoryImpl cannot be cast to javax.xml.datatype.DatatypeFactory
       at javax.xml.datatype.DatatypeFactory.newInstance(DatatypeFactory.java:131) ~[xml-apis-1.4.01.jar:1.6.0_45]
       at com.sun.xml.bind.DatatypeConverterImpl.<clinit>(DatatypeConverterImpl.java:831) ~[glassfish.jaxb_1.0.0.0_2-1-12.jar:2.1.12]
       ... 68 common frames omitted

xerces-impl重新定义了一些jre类,并附带了xml-apis,它重新定义了一些jre接口。 org.apache.xerces.jaxp.datatype.DatatypeFactoryImpl来自xerces-impl。

我使用的是weblogic 10.3.5和JDK 6.

我读了Dealing with "Xerces hell" in Java/Maven?并尝试排除xml-apis但xerces-impl抛出NoClassDefFoundError。在jre / lib / endorsed中复制xml-apis和xerces-impl也会抛出ClassCastException(http://docs.oracle.com/javase/6/docs/technotes/guides/standards/)。

在启动命令抛出时添加-Djavax.xml.datatype.DatatypeFactory = com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl:

 Caused by: java.lang.ClassCastException: org.apache.xerces.jaxp.SAXParserFactoryImpl cannot be cast to javax.xml.parsers.SAXParserFactory
    at javax.xml.parsers.SAXParserFactory.newInstance(SAXParserFactory.java:128) ~[xml-apis-1.4.01.jar:1.6.0_45]
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.getXMLReader(AbstractUnmarshallerImpl.java:80) ~[na:1.6.0_45]

然后添加-Djavax.xml.parsers.SAXParserFactory = com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl抛出:

 Caused by: java.lang.ClassCastException: com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl cannot be cast to javax.xml.parsers.SAXParserFactory
    at javax.xml.parsers.SAXParserFactory.newInstance(Unknown Source)
    at ch.qos.logback.core.joran.event.SaxEventRecorder.buildSaxParser(SaxEventRecorder.java:79)

我不知道接下来该做什么。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

WebLogic在类路径中包含了许多这些库的版本,&amp;他们可以干扰你的应用程序。尝试将这样的部分添加到weblogic.xml文件中:

<weblogic-web-app>

  <container-descriptor>
    <prefer-application-packages>
        <package-name>org.slf4j.*</package-name>
        <package-name>org.slf4j.helpers.*</package-name>
        <package-name>org.slf4j.impl.*</package-name>
        <package-name>org.slf4j.spi.*</package-name>
    </prefer-application-packages>
  </container-descriptor>
  ...
</weblogic-web-app>

该示例显示了slf4j的软件包;我不确定它们对于xerces会是什么。如果您有权访问wls-cat tool,那么应该有助于解决问题。


更新

WLS与您的应用之间的类路径冲突可以通过三种方式之一修复。

  1. 将包添加到<prefer-application-packages>元素,以便应用优先
  2. 更改POM以注意WLS
  3. 的特定依赖关系为provided
  4. 完全排除POM的依赖关系。
  5. 我建议将mvn dependency:tree与之前版本的OpenSAML一起使用,请注意依赖项。然后转到新的OpenSAML版本,&amp;请注意引入了哪些新的依赖项。查看WLS服务器的modules目录以查看WLS正在使用的库,使用新的OpenSAML版本交叉引用此更改的依赖项,并确定3种可能性似乎是最合适的。例如,如果您可以看到WLS使用比您的应用程序更早版本的lib,您可能希望使用选项1.执行此操作直到您可以部署应用程序,然后使用wls-cat完成作业。

答案 1 :(得分:0)

除了javax.xml.bind作为prefer-application

<wls:package-name>javax.xml.bind.*</wls:package-name>
在weblogic.xml中

,添加jaxb依赖项解决了我的问题:

<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>${jaxb-impl.version}</version>
</dependency>
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>${jaxb-api.version}</version>
</dependency>