如何根据Dominemplementation的版本调试java依赖性故障

如何根据Dominemplementation的版本调试java依赖性故障,java,xml,dom,dependencies,Java,Xml,Dom,Dependencies,我有一段代码在隔离状态下运行良好,但在客户端项目中使用依赖项失败。打电话给 Document doc=impl.createDocument(null,null,null) 失败(看起来问题出在)。我的单元测试中的“impl”实例是com.sun.org.apache.xerces.internal.dom.dominplementimpl的一个实例。在我的客户机代码中,它是org.apache.xerces.dom.dominimplementation的一个实例 如何追溯此依赖关系?我尝试手

我有一段代码在隔离状态下运行良好,但在客户端项目中使用依赖项失败。打电话给

Document doc=impl.createDocument(null,null,null)

失败(看起来问题出在)。我的单元测试中的“impl”实例是com.sun.org.apache.xerces.internal.dom.dominplementimpl的一个实例。在我的客户机代码中,它是org.apache.xerces.dom.dominimplementation的一个实例


如何追溯此依赖关系?我尝试手动检查类路径中的所有类和jar文件,但找不到org.apache.xerces.dom.dominemplementation的提供者。是否可以观察何时加载类(以及为什么)?如何选择特定的DOM实现?我现在可以强制jvm使用特定的实现吗?

最有可能的情况是,客户端项目的类路径中没有xercesImpl.jar

在“com.sun.org.apache…”包中的实现是打包为JRE一部分的Xerces。以“org.apache…”开头的是apache的独立发行版。它们可以在同一个应用程序中一起运行,但可能会变得非常混乱


您客户机的项目似乎包含独立apache发行版的副本(可能是xercesImpl.jar)。让他们快速眼动,移动它,看看它是否开始使用内置的JRE代码。

我认为你可以处理这些事情。

这是有道理的。现在的问题是哪个jar拥有apache发行版。类路径中没有xercesImpl,我也找不到哪个jar有org.apache.xerces.*类。使用-Djaxp.debug=true运行会打印JAXP:found-jar resource=META-INF/services/javax.xml.parsers.DocumentBuilderFactory,使用ClassLoader:sun.misc.Launcher$AppClassLoader@53372a1a但遗憾的是,它没有说明是哪个jar,其中肯定有一个jar包含META-INF/services/javax.xml.parsers.DocumentBuilderFactory条目。记住也要检查客户端的JRE安装内部,他们可能已经将xerces放在那里了。