【发布时间】:2012-08-30 07:57:56
【问题描述】:
我有一个 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 验证) -
jre/lib目录下没有jaxp.properties文件
使用-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...。 那不应该是后备值吗?
【问题讨论】:
-
你检查
CATALINA_HOME/lib了吗? -
Tomcat 5.5 不使用
$CATALINA_HOME/lib。 Afaik 那是Tomcat 6+。我检查了$CATALINA_HOME/server、common和shared,但无济于事。 -
org.apache.xalan.processor.TransformerFactoryImpl类可能来自较旧的 JDK1.4 设置,所以我预计您的CLASSPATH上的某处会有一个可疑的 xalan.jar -
顺便说一句,根据apache docs CATALINA_HOME is supported。该链接详细描述了类路径,它可以帮助您检查有问题的 jar 的相应目录。