【问题标题】:Specific multiple SAXParserFactory implementations in one web application在一个 Web 应用程序中指定多个 SAXParserFactory 实现
【发布时间】:2012-08-22 02:51:12
【问题描述】:

我在 tomcat 上有一个 Web 应用程序。应用程序需要两个 SAXParserFactory 实现:一个是 JDK 默认实现com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl,另一个来自 xerces:org.apache.xerces.jaxp.SAXParserFactoryImpl

问题来了,SAXParserFactory.newInstance()只是按照特定顺序选择only一个实现,如下:

  • 使用 javax.xml.parsers.SAXParserFactory 系统属性。
  • 使用将 JAVA_HOME(安装 jdk 的父目录)/lib/jaxp.properties 用于包含实现类名称的属性文件,其键值与上面定义的系统属性相同。
  • 如果可用,请使用服务 API(如 JAR 规范中所述)来确定类名。服务 API 将在运行时可用的 jar 中的 META-INF/services/javax.xml.parsers.SAXParserFactory 文件中查找类名。
  • 平台默认 SAXParserFactory 实例。

我尝试在不同的 jar 文件中配置 javax.xml.parsers.SAXParserFactory 中的不同类名。但它是整个类加载器的范围。在 tomcat 中,所有应用程序库都加载到一个类加载器中。例如,A.jar 中的配置文件会覆盖 B.jar 中的配置,最终所有应用程序都从 A.jar 中获取配置。

所以我的问题是如何在一个 Web 应用程序中指定这两个 SAXParserFactory 实现?谢谢。

【问题讨论】:

  • 你不能得到一个实现,然后设置javax.xml.parsers.SAXParserFactory系统属性,然后得到另一个实现吗?

标签: java jakarta-ee xml-parsing sax saxparser


【解决方案1】:

很确定你不能(除非你使用多个类加载器)。依赖于其他实现的代码应该直接实例化它(使用实现类名)。

【讨论】:

  • 感谢您的回答!但是我在 SAXParserFactory 中没有找到任何方法来指定实现。
  • 你不会使用 SAXParserFactory,只需要new org.apache.xerces.jaxp.SAXParserFactoryImpl
【解决方案2】:

使用的实现也可以通过

定义
-Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl

作为 java 命令行参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 2018-08-14
    相关资源
    最近更新 更多