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;他们可以干扰你的应用程序。尝试将这样的部分添加到
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和您的应用程序之间的类路径冲突可以通过三种方式之一修复。
我建议将
除了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> |