我的应用程序的类路径中都有Xerces和Oracle XML解析器(不要问为什么)。
当我创建新的javax.xml.parsers.DocumentBuilderFactory
时,类加载器会自动选择Oracle XML解析器。但是,它不是一个完整/正确的实现,所以它给我带来了麻烦。
在构建文档构建器工厂时,有没有办法可以强制/告诉类加载器使用Xerces parces?
答案 0 :(得分:5)
对于我的大型项目,skaffman的答案在大部分时间都有效,但不是所有时间,因为我们有多个依赖于这些库的子项目。我们查看了javax.xml.transform.TransformerFactory.newInstance()的源代码,发现它使用了javax.xml.transform.FactoryFinder.find(“javax.xml.transform.TransformerFactory”,...)。然后,此方法查看系统参数以确定正确的实现。
我们最终通过向运行时添加-D参数来强制使用正确的类来修复它:
-Djavax.xml.transform.TransformerFactory = org.apache.xalan.processor.TransformerFactoryImpl -Djavax.xml.parsers.SAXParserFactory = org.apache.xerces.jaxp.SAXParserFactoryImpl -Djavax.xml.parsers.DocumentBuilderFactory = org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
答案 1 :(得分:3)
DocumentBuilderFactory
有一个newInstance()
方法,您可以在其中指定要使用的实现的类名。
答案 2 :(得分:0)
我也遇到类似的情况,但是我们的代码使用org.xml.sax.helpers.XMLReaderFactory.createXMLReader()
创建了sax解析器(在8u162中仍然存在错误)。
可以使用system属性解决此问题
-Dorg.xml.sax.driver=org.apache.xerces.parsers.SAXParser