我在应用程序的类路径中都有Xerces和Oracle XML解析器(不要问为什么)。
当我创建一个new时javax.xml.parsers.DocumentBuilderFactory,类加载器会自动选择Oracle XML解析器。但是,这不是完整/正确的实现,因此让我头疼。
在构造文档构建器工厂时,是否有一种方法可以强制/告诉类加载器使用Xerces parces?
对于我的大型项目,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