在我的Web应用程序中将Java 7升级到Java 8时,Saxon遇到了这个问题:
javax.xml.xpath.XPathFactoryConfigurationException: java.util.ServiceConfigurationError:javax.xml.xpath.XPathFactory: jar:文件:/ C:/Users/abc/.m2/存储库 /net/sf/saxon/saxon-xpath/9.1.0.8/saxon-xpath-9.1.0.8.jar!/META-INF/services/javax.xml.xpath.XPathFactory:2: 非法的配置文件语法 在java.util.ServiceLoader.fail(ServiceLoader.java:239) 在java.util.ServiceLoader.fail(ServiceLoader.java:245) 在java.util.ServiceLoader.parseLine(ServiceLoader.java:265) 在java.util.ServiceLoader.parse(ServiceLoader.java:307) 在java.util.ServiceLoader.access $ 200(ServiceLoader.java:185) 在java.util.ServiceLoader $ LazyIterator.hasNextService(ServiceLoader.java:357) 在java.util.ServiceLoader $ LazyIterator.hasNext(ServiceLoader.java:393) 在java.util.ServiceLoader $ 1.hasNext(ServiceLoader.java:474) 在javax.xml.xpath.XPathFactoryFinder $ 2.run(XPathFactoryFinder.java:345) 在javax.xml.xpath.XPathFactoryFinder $ 2.run(XPathFactoryFinder.java:341) 在java.security.AccessController.doPrivileged(本机方法) 在javax.xml.xpath.XPathFactoryFinder.findServiceProvider(XPathFactoryFinder.java:341) 在javax.xml.xpath.XPathFactoryFinder._newFactory(XPathFactoryFinder.java:212) 在javax.xml.xpath.XPathFactoryFinder.newFactory(XPathFactoryFinder.java:137) 在javax.xml.xpath.XPathFactory.newInstance(XPathFactory.java:190)
我将撒克逊人升级为撒克逊人HE,但是它不起作用:
Q {java:org.apache.commons.lang3.StringUtils} isBlank()。反身 在Saxon-HE下无法调用Java方法
在net.sf.saxon.style.StylesheetModule.loadStylesheet(StylesheetModule.java:261) 在net.sf.saxon.style.Compilation.compileSingletonPackage(Compilation.java:107) 在net.sf.saxon.s9api.XsltCompiler.compile(XsltCompiler.java:785) 在net.sf.saxon.jaxp.SaxonTransformerFactory.newTemplates(SaxonTransformerFactory.java:149)
移动到许可的Saxon PE或其他设备是不可能的:/
我不确定为什么,但是应用程序使用XpathFactory这样:
XPath xpath = XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON).newXPath();
我不知道为什么选择了这个对象模型,例如OBJECT_MODEL_DOM4J
我想知道是否:
1)是否有一些可以在Java 8中运行的免费商业用saxon?我不必是最新的,我们使用的是9.1.0.8或9.1.0.6J。
2)这是什么NamespaceConstant.OBJECT_MODEL_SAXON,是否可以从Saxon辞职并转到OBJECT_MODEL_DOM4J并使用dom4j替代,或者还有其他方法可以使用免费库来实现类似的功能? / p>
XPath xpath = XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON).newXPath();
xpath.setNamespaceContext(new NamespaceContextMap("a12i", "http://my-application/a12"));
return xpath.compile(MY_XPATH_QUERY);
答案 0 :(得分:1)
您可以在此处找到有关此问题的信息
Syntax error in javax.xml.xpath.XPathFactory provider-configuration file of Saxon-HE 9.3
以及从那里引用的各种线程中。其实质是Saxon的早期版本使用了服务文件的格式(支持XPathFactory JAXP搜索机制),该格式在Java 5中有效,而在后续的Java版本中则无效(Saxon疏忽地依赖于Java中的错误随后被修复)。
正如您所指出的,从Saxon-B(9.1)迁移到Saxon-HE可能会出现问题,因为某些功能(尤其是自反扩展功能)并未得到继承。但是,还有其他方法可以在以后的发行版中获得相同的效果,而不会出现与自反扩展功能相关的安全问题。
如果您想使用Saxon-B(9.1),则可以通过更改XPathFactory.newInstance()的调用直接实例化Saxon XPathFactory,使其在较新的Java版本上运行。对象模型的选择与问题无关。