关于java:JDK6和xml-apis之间的冲突

Conflicts between JDK6 and xml-apis

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

1
2
3
4
 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上。

我读过在Java / Maven中处理"Xerces hell"?并尝试排除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:

1
2
3
 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抛出:

1
2
3
 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)

我不知道接下来该做什么。任何的想法 ?


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

1
2
3
4
5
6
7
8
9
10
11
12
<weblogic-web-app>

  <container-descriptor>
    [cc lang="java"]
        <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工具,那么应该有助于解决这个问题。

更新

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

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


    除了javax.xml.bind之外,还有prefer-application

    1
    <wls:package-name>javax.xml.bind.*</wls:package-name>

    在weblogic.xml中,添加jaxb依赖项解决了我的问题:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        jaxb-impl</artifactId>
        <version>${jaxb-impl.version}</version>
    </dependency>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        jaxb-api</artifactId>
        <version>${jaxb-api.version}</version>
    </dependency>