JAXP XSLT转换器默认使用错误的实现

Jon*_*han 5 java xslt tomcat jaxp

我有一个Tomcat 5.5 Web应用程序,它使用Apache Commons-Configuration库在运行时生成XML配置文件.反过来,Commons-Configuration使用javax.xml.transformJAXP API来完成此任务.

自升级到Java 7以来,操作失败,并显示以下错误消息:

Caused by: javax.xml.transform.TransformerFactoryConfigurationError: Provider org.apache.xalan.processor.TransformerFactoryImpl not found
    at javax.xml.transform.TransformerFactory.newInstance(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

在过去的版本中,我从未捆绑过xalan.jar,而是依赖于平台默认的XSLT实现.

我检查过的一些事情:

  • META-INF/services/javax.xml.transform.TransformerFactory我的任何应用程序JAR文件,库jar或Tomcat jar中都没有条目
  • javax.xml.transform.TransformerFactory系统属性未设置(在通过JVisualVM运行时验证)
  • 目录中没有jaxp.properties文件jre/lib

运行with -Djaxp.debug=1会产生以下输出:

JAXP: find factoryId =javax.xml.transform.TransformerFactory
JAXP: loaded from fallback value: org.apache.xalan.processor.TransformerFactoryImpl
Run Code Online (Sandbox Code Playgroud)

这个后备价值来自哪里?Oracle发布了Xalan变压器,但由于1.7已将其重新打包为com.sun.org.apache.xalan.processor....不应该是回退值?

Jon*_*han 8

自己发现了这个问题.事实证明我apache-tomcat-5.5.23-compat安装了文件,因为我从Java 1.4.2迁移.解决方案是删除$CATALINA_HOME/common/endorsed目录下的所有内容(特别是xercesImpl.jarxml-apis.jar)和bin/jmx.jar文件.