代码之家  ›  专栏  ›  技术社区  ›  Johann Goulley

JDK6和xmlapi之间的冲突

  •  2
  • Johann Goulley  · 技术社区  · 10 年前

    将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类,并附带了重新定义一些jre接口的xmlapi。 org.apache.xerces.jaxp.datatype.DatatypeFactoryImpl来自xerces-impl。

    我使用weblogic 10.3.5和JDK6。

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

    在启动命令throws中添加-Djavax.xml.datatype.DatatypeFactory=com.sun.org.apache.xerces.internal.javasp.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 throws:

     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 回复  |  直到 7 年前
        1
  •  1
  •   user944849    10 年前

    WebLogic在类路径中包含了许多这些库的自己版本;他们会干扰你的应用程序。尝试将这样的分区添加到 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以注意特定的依赖关系 provided 由WLS提供
    3. 从POM中完全排除依赖项。

    我建议使用 mvn dependency:tree 对于以前版本的OpenSAML,请注意依赖关系。然后更改为新的OpenSAML版本;注意引入了哪些新的依赖项。请查看WLS服务器的 modules 目录以查看WLS正在使用的库,将其与新的OpenSAML版本的已更改依赖项进行交叉引用,并决定三种可能性中的哪一种最适合。例如,如果您可以看到WLS使用的是比您的应用程序更早的lib版本,那么您可能希望使用选项1。这样做直到你可以部署应用程序,然后使用wls-cat完成任务。

        2
  •  0
  •   Johann Goulley    10 年前

    除了javax.xml.bind作为首选应用程序之外

    <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>