java - Xerces 中缺少 JAXP 1.5 支持 - 可能的解决方法?

标签 java xml xerces jaxp

我遇到了 Xerces 库的一些问题,我依赖的第三方库使用了它。

Xerces 尚不支持 JAXP 1.5,JAXP 1.5 包含在最新版本的 JDK 1.7 和 JDK 8 中。如果将 Xerces 用作 XML 解析器,这会导致一些问题,当系统知道多个 XML 解析器时可能会发生这种情况。删除 xercesImpl-v2.9.0.jar立即解决了问题,但随后第 3 方库不再工作。

我可以看到该问题的两种解决方案:

  • 似乎实际使用的 Xerces 库中唯一的位是 org.apache.xerces.util.XMLCatalogResolver ,用于 CustomResolver.java .目录解析器是否有其他选项而不是 Xerces 选项?
  • 另一种选择似乎是在 JVM 启动时为 XML 解析显式设置系统属性。这样 JVM 就可以告诉要使用哪个 XML 解析器,并且它不会再选择 Xerces。

  • 我发现了以下三个属性:
     -Djavax.xml.transform.TransformerFactory
     -Djavax.xml.parsers.SAXParserFactory
     -Djavax.xml.parsers.DocumentBuilderFactory
    

    不过,这会导致两个问题:
  • 这三个属性是唯一需要设置以便将 JVM 重定向到特定 XML 解析器的系统属性吗?
  • 明确设置属性会产生任何副作用吗?
  • 最佳答案

  • 实际上,设置这三个系统属性将允许您设置 JAXP 实现以在运行时使用。
  • 如果您使用显式依赖于 Xerces 的 3rd 方库,这对您无济于事,这对您来说似乎就是这种情况(如您所写,从类路径中删除 xerces 会导致您的第 3 方库之一中断)。

  • 因此,首先,决定您是否可以避免使用该第 3 方库,并使用对 Xerces 没有硬依赖关系的替代库。由于 JAXP 现在已经相当成熟,对 Xerces 的硬依赖的唯一合理场景是如果您的第 3 方库使用一些非常特定的 Xerces 功能来完成其工作。

    如果您可以避免使用该 3rd 方库,那么请这样做。

    否则,您可以设置这三个系统属性,并将 Xerces 保留在类路径中。然后会发生的是:
  • 仅使用 JAXP API 的代码将切换到使用您选择的 JAXP 实现。
  • 您有问题的第 3 方库将继续使用 Xerces。

  • 如果 Xerces 和新解析器之间存在与类加载相关的冲突,那么您仍有可能遇到问题。在那种情况下,恐怕你很不走运(除非你能以某种方式确保两个解析器的两种用法是在不同的类加载器下完成的)。

    关于java - Xerces 中缺少 JAXP 1.5 支持 - 可能的解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21827340/

    相关文章:

    c# - 构建一个 "scriptable"应用程序

    python - Xerces + Python?

    java - Apache Xerces 是流式 XML 解析器吗?

    java - 如何创建 Vaadin 多行按钮

    java - 我的简单程序显示了我的位置,但没有显示在微调器中选择的位置的多段线

    java - 在jsp中从mysql获取xml格式的数据

    尝试解析具有 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"实体的文档时出现 java.net.MalformedURLException

    java - 在 OS X El Capitan 上运行 IBM Notes Java 应用程序会抛出 UnsatisfiedLinkError

    java - 使用 xpath 查询获取具有特定值的元素

    c# - .NET 与 COM 中的 XML 复杂命名空间