0

I have a web application on tomcat. The application needs two SAXParserFactory implements: one is JDK default implement com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl, the other one is from xerces: org.apache.xerces.jaxp.SAXParserFactoryImpl.

Here's the problem, SAXParserFactory.newInstance() just selects only one implementation by specific order, as follows:

  • Use the javax.xml.parsers.SAXParserFactory system property.
  • UseUse the JAVA_HOME(the parent directory where jdk is installed)/lib/jaxp.properties for a property file that contains the name of the implementation class keyed on the same value as the system property defined above.
  • 如果可用,请使用服务 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 实现?谢谢你。

4

2 回答 2

0

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

于 2012-08-27T15:37:25.393 回答
-1

使用的实现也可以通过定义

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

作为java命令行参数。

于 2022-01-25T11:24:44.177 回答