【问题标题】:JAXP XSLT transformer using wrong implementation by defaultJAXP XSLT 转换器默认使用错误的实现
【发布时间】: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/servercommonshared,但无济于事。
  • org.apache.xalan.processor.TransformerFactoryImpl 类可能来自较旧的 JDK1.4 设置,所以我预计您的 CLASSPATH 上的某处会有一个可疑的 xalan.jar
  • 顺便说一句,根据apache docs CATALINA_HOME is supported。该链接详细描述了类路径,它可以帮助您检查有问题的 jar 的相应目录。

标签: java xslt tomcat jaxp


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-13
      • 1970-01-01
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 2013-12-04
      相关资源
      最近更新 更多