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

时间:2012-09-05 14:48:42

标签: java xslt tomcat jaxp

我有一个Tomcat 5.5 Web应用程序,它使用Apache Commons-Configuration库在运行时生成XML配置文件。反过来,Commons-Configuration使用javax.xml.transform JAXP 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)

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

我检查了一些事情:

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

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

JAXP: find factoryId =javax.xml.transform.TransformerFactory
JAXP: loaded from fallback value: org.apache.xalan.processor.TransformerFactoryImpl

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

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:0)

同样的问题我也使用Glassfish服务器V3.1并将xalan-2.7.0.jar放在$ GLASSFISH_HOME \ lib \ endorsed目录中,问题得到解决。