2012-01-15 66 views
1

我需要在一个Web应用程序内使用一个xsl转换,我决定使用saxon来实现xml。我将saxon(版本9.1)作为依赖项包含在pom.xml中。但我仍然不断收到此错误 - 提供商net.sf.saxon.TransformerFactoryImpl没有找到Tomcat的Web应用程序 - 指定TransformerFactoryImpl类不起作用

我发现这个线程, How to select saxon TransformerFactory in Java

,也建议所有的,设置属性,指定与撒克逊实施服务文件类。出于灵活性原因,我无法直接创建TransformerFactoryImpl的实例。那么,我还有其他选择吗?

由于提前,

编辑:这是错误的堆栈跟踪 -

javax.xml.transform.TransformerFactoryConfigurationError: Provider net.sf.saxon.TransformerFactoryImpl not found 
javax.xml.transform.TransformerFactory.newInstance(TransformerFactory.java:108) 
com.mondeca.sesame.toolkit.repository.XMLtoRDFDataInjector.injectData(XMLtoRDFDataInjector.java:83) 
com.mondeca.sesame.toolkit.repository.LocalMemoryRepositoryProvider.init(LocalMemoryRepositoryProvider.java:105) 
org.datalift.modules.base.XmlConverter.applyXslTransformation(XmlConverter.java:192) 
org.datalift.modules.base.XmlConverter.transformData(XmlConverter.java:204) 
org.datalift.modules.base.XmlConverter.transformData(XmlConverter.java:174) 
org.datalift.modules.base.XmlConverter.loadSourceData(XmlConverter.java:149) 

从中很明显,它不能找到撒克逊人。但我根本不明白为什么!我可以看到它也打包在jar文件中!

回答

1

我认为这将是一个人寻找一个解决方案是有用的。我很久以前就解决了这个问题,但是我忘了在这里更新它。基本上,tomcat将尝试使用它自己的实现来调用任何XML实现。我使用的tomcat(必须是6.0.23)没有包含最新的XML API来处理XSLT转换(我需要可以处理XSLT2的API)。实际上tomcat在这里有一些奇怪的行为,它不会首先从类路径加载类,而是尝试从它自己的库(它可能包含所有必需的java类)加载类,这不是加载类的自然顺序。所以,在清单文件中指定将无济于事。另一方面,我们可以通过在启动服务器时指定一个选项来完成此操作。在这个问题上

0

你可以尝试添加撒克逊JAR到CLASSPATH和负载撒克逊使用:

TransformerFactory transFactory = new net.sf.saxon.TransformerFactoryImpl(); 
+0

使用此选项,服务器ARG

-Djava.endorsed.dirs=$JAVA_ENDORSED_DIRS 

欲了解更多信息,tomcat的official documentation正如我上面提到的“对于灵活性的原因,我不能直接创建的TransformerFactory的一个实例,”这段代码是在插件和创建TransformerFactory的实例是(是)平台的工作。 – Ozyman 2012-10-02 09:53:21