【问题标题】:XSL FO failing XSLT translation in JBOSS AS 7XSL FO 在 JBOSS AS 7 中无法进行 XSLT 转换
【发布时间】:2013-09-24 00:03:46
【问题描述】:

我有以下代码

SAXTransformerFactory stfactory;
stfactory = (SAXTransformerFactory) TransformerFactory.newInstance();

/// ClassLoaderUriResolver is another class.
 stfactory.setURIResolver(new ClassLoaderUriResolver()); 

 InputStream is = this.getClass().getClassLoader().getResourceAsStream("xsl/Hello.xsl");
 StreamSource streamSource = new StreamSource(is);

  mergeHandler = stfactory.newTransformerHandler(streamSource);

 XMLReader xmlReader = XMLReaderFactory.createXMLReader();

还有一些代码.....

问题出在线路上 mergeHandler = stfactory.newTransformerHandler(streamSource);

当我在 JBOSS IDE 中将这个程序作为独立的 JAVA 程序运行时,使用相同的 jar 集

  • xalan-2.7.0.jar
  • xercesImpl-2.7.1.jar
  • xml-apis-1.3.04.jar
  • xml-apis-ext-1.3.04.jar

我看到调用 stfactory.newTransformerHandler(streamSource);

返回
org.apache.xalan.transformer.TransformerHandlerImpl

MY XLST 翻译可以作为一个简单的 java 程序正常工作

与在 Jboss AS 7 容器上运行时相同的代码 我看到调用 stfactory.newTransformerHandler(streamSource);

返回
org.apache.xalan.transformer.TransformerIdentityImpl(不是 TransformerHandlerImpl)

因此,当我在 Jboss AS 7 Container 上作为 Web 应用程序的一部分运行时,XSLT 转换没有发生,我没有看到任何错误。我的 XLS FO 文档未翻译。

如何强制代码使用 org.apache.xalan.transformer.TransformerHandlerImpl

【问题讨论】:

  • 我猜一个 java 问题。两者在执行时的类路径是什么?
  • 基于那个答案,我假设你不明白你在做什么。这个问题很简单,任何了解 Java 的人都会知道答案。再试一次......我问“两者的类路径是什么”我没有问你使用的是什么版本的 Java。
  • 凯文,对不起,这是类路径。这是我的类路径中 jar 的完整列表。 version.JAXP=1.1 或更高版本 java.ext.dirs=C:\JAVA\jdk1.7.0_25\jre\lib\ext version.xerces2=Xerces-J 2.7.1 version.xerces1=not-present version.xalan2_2=Xalan Java 2.7.0 java.version=1.7.0_25 version.DOM=2.0 version.SAX=2.0 version.xalan2x=Xalan Java 2.7.0 java.class.path=C:\lib\xalan-2.7.0.jar;C :\lib\batik-util-1.7.jar;C:\lib\avalon-framework-impl-4.3.1.jar; C:\lib\fop-0.95.jar;C:\lib\xercesImpl-2.7.1.jar;C:\lib\xml-apis-1.3.04.jar;C:\lib\xml-apis-ext- 1.3.04.jar C:\lib\xmlgraphics-commons-1.3.1.jar
  • 凯文,谢谢。我更深入地挖掘课程路径,并让它发挥作用。请看下面的答案。再次感谢。

标签: java xslt jboss7.x xsl-fo


【解决方案1】:

我让它工作了。

在 jboss 中,除了我们可以排除的模块之外,还有另一个位于根目录 C:\jboss-eap-6.0\jboss-modules.jar 的 jar。在这个 jar 中有一个名为“__redirected”的文件夹,其中包含一个类 __TransformerFactory.class,代码如下。

Class clazz = __RedirectedUtils.loadProvider(id, javax/xml/transform/TransformerFactory, loader);

这会强制从 C:\jboss-eap-6.0/jboss-modules.jar 加载“org.apache.xalan.processor.TransformerFactoryImpl”

但是这不是一个模块,所以我不能使用 jboss-deployment-structure.xml 排除它,尽管我已经排除了以下用于 Xalan、Xercel 和 XML api 的 jboss 模块。因为我们在 EAR 库中有一个特定的 jars 来满足这一点。

jboss-deployment-structure.xml

<jboss-deployment-structure xmlns:p="urn:jboss:deployment-structure:1.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <deployment>
                            <exclusions>
                                          <module name="org.apache.xerces" />
                                            <module name="org.apache.xalan" />
                                            <module name="org.apache.xml-resolver" />
                            </exclusions>

            </deployment>

所以我注释了下面的代码

  stfactory = (SAXTransformerFactory) TransformerFactory.newInstance();

并添加了

  Class clazz = Class.forName("org.apache.xalan.processor.TransformerFactoryImpl");
  stfactory = (SAXTransformerFactory) clazz.newInstance();

现在我明白了

  • org.apache.xalan.processor.TransformerFactoryImpl 正在从 C:/jboss-eap-6.0/standalone/deployments/TST.ear/lib/xalan-2.7.0.jar 加载

  • 调用 stfactory.newTransformerHandler(streamSource) 返回“org.apache.xalan.transformer.TransformerHandlerImpl”而不是“org.apache.xalan.transformer.TransformerIdentityImpl”

所以我相信 jar “C:\jboss-eap-6.0\jboss-modules.jar” 是类加载器的一部分,在 EAR 类加载器之上。所以它没有将 Xalan.2.7.0.jar 用于“org.apache.xalan.processor.TransformerFactoryImpl”。但是,当我们调用 stfactory.newTransformerHandler(streamSource) 时,它会返回“org.apache.xalan.transformer.TransformerIdentityImpl” .

对于这种行为,C:\jboss-eap-6.0\jboss-modules.jar 中可能有一些东西。

我不明白的是,在我使用 Xalan.2.7.0.jar 的一项测试中,并补充说在 java.endorsed.dir 中它仍在使用 C:\jboss-eap-6.0\jboss-modules。 jar 这并不令人惊讶,因为我认为 endorsed 中的 jar 甚至会在 C:\jboss-eap-6.0\jboss-modules.jar 之前加载。

但无论如何,当前的修复解决了这个问题,它只发生在 Jboss 应用程序服务器 7 上。代码在 Webspshere 7.0 中没有任何变化,当我作为独立的 java 程序运行时也可以工作。

【讨论】:

    猜你喜欢
    • 2012-03-15
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多