我最近获得了萨克森-PE的试用许可证,并希望在骆驼中使用这个版本的撒克逊。我下载了Saxon-PE-9.6.0.8罐,并通过maven将它们包含到我的项目中。我用的是骆驼2.16.0。我尝试过许多方法,但我已经取得了最大的进展,使用骆驼的“?transformerFactory=.”选项并将其传递给Saxon的ProfessionalTransformerFactoryImpl,它在我的Spring中注册为bean。
在启动我的应用程序时,使用xslt转换进行路由初始化时会出现以下堆栈跟踪失败:
由: java.lang.IllegalStateException:错误预加载Saxon类引起。确保类路径上有saxon,类加载器可以加载以下两个类: net.sf.saxon.event.Receiver、net.sf.saxon.serialize.MessageWarner。在org.apache.camel.builder.xml.XsltBuilder.doStart(XsltBuilder.java:618) ~骆驼-核心-2.16.0.jar:2.16.0在org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61) ~骆驼-2.16.0.jar:2.16.0在org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:74) ~骆驼-核心-2.16.0.jar:2.16.0在org.apache.camel.component.xslt.XsltEndpoint.doStart(XsltEndpoint.java:396) ~骆驼-核心-2.16.0.jar:2.16.0在org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61) ~骆驼-核心-2.16.0在org.apache.camel.impl.DefaultCamelContext.startService(DefaultCamelContext.java:3219) ~骆驼-核心-2.16.0.jar:2.16.0在org.apache.camel.impl.DefaultCamelContext.startService(DefaultCamelContext.java:3219)~骆驼-核心:2.16.0在org.apache.camel.impl.DefaultCamelContext.doAddService(DefaultCamelContext.java:1209) ~骆驼-核心-2.16.0.jar:2.16.0在org.apache.camel.impl.DefaultCamelContext.addService(DefaultCamelContext.java:1170) ~骆驼-核心-2.16.0在org.apache.camel.impl.DefaultCamelContext.addService(DefaultCamelContext.java:1166) ~骆驼-核心-2.16.0.jar:2.16.0在org.apache.camel.impl.DefaultCamelContext.getEndpoint(DefaultCamelContext.java:583) ~camel-core-2.16.0.jar:2.16.0 .由: java.lang.NoSuchMethodException: net.sf.saxon.jaxp.TransformerImpl.setMessageEmitter(net.sf.saxon.event.Receiver) at java.lang.Class.getMethod(Class.java:1786) ~na:1.8.0_45 at org.apache.camel.builder.xml.XsltBuilder.doStart(XsltBuilder.java引起的38种常见帧省略:616) ~骆驼芯-2.16.0.jar:2.16.0.省略47种常见帧
问题是JAXP setMessageEmitter()方法不存在于JAXP TransformerImpl中。
如果有人有任何经验,将萨克森-PE/EE与骆驼,我将感谢任何投入。我需要Saxon来使用来自xsl样式表的外部函数调用。以前,在同一个项目中,我使用了saxon(通过camel-saxon maven依赖),没有任何麻烦。只有在切换到撒克逊-PE时,才会出现这个问题。
我可以提供任何其他可能有用的细节。提前谢谢。
发布于 2016-01-05 14:32:58
Saxon基本上有三层接口。第1层是公共API,包括JAXP和XQJ接口以及s9api接口。我们非常努力地让这些版本在不同版本之间保持兼容。第二层是“系统编程接口”--一些低级的东西,但集成商经常需要它们--例如NodeInfo接口和接收接口。Saxon主要版本之间通常会对SPIs进行一些小的更改(例如9.5到9.6,或9.6到9.7)。使用维护版本(例如9.5.0.7至9.5.0.8),我们非常努力地避免任何不兼容的更改。我们试图避免对SPIs进行不必要的更改,即使在主要版本中也是如此,但是如果在体系结构上是必要的,我们将进行更改。例如,在9.6之前,我们将接收接口中的位置信息(系统id、行号和列号)公开为全局唯一整数。但是在XSLT3.0和Saxon9.7中引入了单独编译的包,这意味着这个设计变得不可行,所以我们转而传递一个Location对象。尽管这些更改很小,但它们足以确保使用Saxon并在稳定的公共API之外的应用程序通常需要重新编译才能使用新的Saxon版本。
第三层由内部API组成:一个例子是编译器构建的表达式树的结构。虽然一些第三方应用程序(例如调试器或性能分析器)可能需要访问这些接口,但我们没有尝试在一个主要版本之间保持它们的兼容性。
我认为影响Camel的9.5到9.6之间的特殊变化可能是由于内部Controller类不再充当JAXP转换器接口的实现类(因此将转换器转换到Controller不再有效)。多年来,在同时执行各种其他功能的情况下,将Controller保持在此角色的问题缓慢增加;与此同时,JAXP转换接口(它坚定地基于XSLT 1.0)正日益成为Saxon正在做的新事情的边缘,是时候阻止它成为我们内部设计的限制因素了。
我一直认为,我们必须在以下两方面取得平衡:使用户更容易向前迈进和防止代码库中的结构衰退(因而不可靠)。随着产品的成熟,稳定性变得越来越重要,但是像流和模块化编译这样的新工具在体系结构上是破坏性的,我们不想停滞不前。
我们随时准备向有真正困难的用户提供旧版本。
发布于 2016-01-04 21:13:05
Apache 2.16.x不支持Saxon 9.6。我们支持我们测试的Saxon版本,其afair为9.5。
撒克逊团队改变并破坏了他们的API并不是我们的错。因此,我们无法轻松地升级并允许用户使用免费版本9.5运行。
https://stackoverflow.com/questions/34599874
复制相似问题