我遇到了Xerces库的一些问题,我依赖的第三方库使用它。
Xerces不支持JAXP 1.5,它包含在JDK 1.7和JDK 8的最新版本中。如果将Xerces用作XML解析器,这会导致一些问题,当多个XML解析器已知时,可能会发生这种情况。系统。删除xercesImpl-v2.9.0.jar
会立即修复问题,但第三方库不再有效。
我可以看到问题的两个解决方案:
似乎实际使用的Xerces库中唯一的位是CustomResolver.java中使用的org.apache.xerces.util.XMLCatalogResolver。目录解析器还有其他选项而不是Xerces吗?
另一个选择似乎是在JVM启动时显式设置XML解析的系统属性。这样,JVM可以告诉使用哪个XML解析器,并且不再选择Xerces。
我找到了以下三个属性:
-Djavax.xml.transform.TransformerFactory
-Djavax.xml.parsers.SAXParserFactory
-Djavax.xml.parsers.DocumentBuilderFactory
这导致两个问题: - 这三个属性是否是为了将JVM重定向到特定的XML解析器而需要设置的唯一系统属性? - 明确设置属性有任何副作用吗?
提前多多感谢。
干杯,
马丁
答案 0 :(得分:0)
实际上,设置这三个系统属性将允许您设置要在运行时使用的JAXP实现。
如果您使用对Xerces具有显式依赖的第三方库,这将无济于事(正如您所写的(如您所写,从类路径中删除xerces
会导致第三方库中的一部分被破坏)。
因此,首先,确定您是否可以避免使用该第三方库,并使用对Xerces没有硬依赖性的替换库。由于JAXP现在已经相当成熟,因此硬依赖Xerces的唯一合理情况是您的第三方库是否出于工作目的使用一些非常特定的Xerces功能。
如果您可以避免使用该第三方库,请这样做。
否则,您可以设置这三个系统属性,并将Xerces保留在类路径中。然后会发生什么:
如果Xerces和新解析器之间存在与类加载相关的冲突,您仍然有可能会遇到问题。那样的话,恐怕您很不走运(除非您能以某种方式确保两个解析器的两种用法在不同的类加载器下完成)。