我在tomcat上有一个Web应用程序。该应用程序需要两种SAXParserFactory实现:一种是JDK默认实现com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl
,另一种来自xerces:org.apache.xerces.jaxp.SAXParserFactoryImpl
。
这就是问题所在,SAXParserFactory.newInstance()
仅按特定顺序选择一种实现,如下所示:
使用javax.xml.parsers.SAXParserFactory系统属性。
使用JAVA_HOME(安装jdk的父目录)/lib/jaxp.properties作为属性文件,该文件包含实现类的名称,该实现类的名称与上面定义的系统属性具有相同的值。
如果可用,请使用Services API(如JAR规范中所述)确定类名。 Services API将在运行时可用的jar中的文件META-INF / services / javax.xml.parsers.SAXParserFactory中寻找类名。
平台默认的SAXParserFactory实例。
我试图在不同的jar文件中的javax.xml.parsers.SAXParserFactory中配置不同的类名。但这是整个类加载器的范围。在tomcat中,所有应用程序库都加载到一个类加载器中。例如,A.jar中的配置文件将覆盖B.jar中的配置,最终所有应用程序都从A.jar获取配置。
因此,我的问题是如何在一个Web应用程序中具体说明这两个SAXParserFactory实现?谢谢。
最佳答案
十分确定您不能这样做(除非您使用多个类加载器)。依赖于另一个实现的代码应直接实例化它(使用实现类名)。