Java XSL FO在JBOSS AS 7中的XSLT转换失败

Java XSL FO在JBOSS AS 7中的XSLT转换失败,java,xslt,jboss7.x,xsl-fo,Java,Xslt,Jboss7.x,Xsl Fo,我有以下代码 SAXTransformerFactory stfactory; stfactory = (SAXTransformerFactory) TransformerFactory.newInstance(); /// ClassLoaderUriResolver is another class. stfactory.setURIResolver(new ClassLoaderUriResolver()); InputStream is = this.getClass().g

我有以下代码

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)

当我在JBossIDE中以独立JAVA程序的形式使用相同的JAR集运行此程序时

  • xalan-2.7.0.jar
  • xercesImpl-2.7.1.jar
  • xml-api-1.3.04.jar
  • xml-api-ext-1.3.04.jar
我看到调用stfactory.newTransformerHandler(streamSource)

返回值
org.apache.xalan.transformer.TransformerHandlerImpl

而我的XLST翻译作为一个简单的java程序运行良好

其中,当它作为7容器在Jboss上运行时,它的代码是相同的 我看到调用stfactory.newTransformerHandler(streamSource)

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

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

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

在jboss中,除了我们可以排除的模块之外,还有一个jar位于根C:\jboss-eap-6.0\jboss-modules.jar。在这个jar中有一个名为“\uuuuRedirected”的文件夹,其中包含一个类\uuuTransformerFactory.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和XMLAPI的jboss模块。因为我们在EAR库中有一个特定的JAR来满足这个需求

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>
并补充说

  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.annowed.dir中,它仍然使用C:\jboss-eap-6.0\jboss-modules.jar,这一点也不奇怪,因为我认为annowed中的jar甚至会在C:\jboss-eap-6.0\jboss-modules.jar之前加载


但无论如何,当前的修复解决了这个问题,它只发生在JBossApplicationServer7上。在Websphere 7.0中,以及在我作为独立java程序运行它时,代码都可以正常工作。

我猜是一个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=不存在版本。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.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-api-1.3.04.jar;C:\lib\xml-api-ext-1.3.04.jar C:\lib\xmlgraphics-commons-1.3.1.jarKevin,谢谢。我在班级道路上挖了更多的东西,我让它工作起来了。请看下面的答案。再次感谢。
  Class clazz = Class.forName("org.apache.xalan.processor.TransformerFactoryImpl");
  stfactory = (SAXTransformerFactory) clazz.newInstance();