gpt4 book ai didi

java - 将 Saxon-PE 与 Apache Camel 结合使用,预加载 Saxon 类时出错

转载 作者:行者123 更新时间:2023-12-01 21:54:30 25 4
gpt4 key购买 nike

我最近获得了 Saxon-PE 的试用许可证,并希望在 Camel 中使用此版本的 Saxon。我下载了 Saxon-PE-9.6.0.8 jar 并通过 maven 将它们包含到我的项目中。我正在使用 Camel 2.16.0。我已经尝试了很多方法来实现这一点,但我通过使用 Camel 的“?transformerFactory=...”选项并将其传递给 Saxon 的 ProfessionalTransformerFactoryImpl,取得了最大的进展,该选项在我的 Spring 配置中注册为 bean。

启动我的应用程序时,使用 xslt 转换的路由初始化失败,并显示以下堆栈跟踪:

Caused by: java.lang.IllegalStateException: Error pre-loading Saxon classes. Make sure you have saxon on the classpath, and the classloader can load the following two classes: net.sf.saxon.event.Receiver, net.sf.saxon.serialize.MessageWarner. at org.apache.camel.builder.xml.XsltBuilder.doStart(XsltBuilder.java:618) ~[camel-core-2.16.0.jar:2.16.0] at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61) ~[camel-core-2.16.0.jar:2.16.0] at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:74) ~[camel-core-2.16.0.jar:2.16.0] at org.apache.camel.component.xslt.XsltEndpoint.doStart(XsltEndpoint.java:396) ~[camel-core-2.16.0.jar:2.16.0] at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61) ~[camel-core-2.16.0.jar:2.16.0] at org.apache.camel.impl.DefaultCamelContext.startService(DefaultCamelContext.java:3219) ~[camel-core-2.16.0.jar:2.16.0] at org.apache.camel.impl.DefaultCamelContext.doAddService(DefaultCamelContext.java:1209) ~[camel-core-2.16.0.jar:2.16.0] at org.apache.camel.impl.DefaultCamelContext.addService(DefaultCamelContext.java:1170) ~[camel-core-2.16.0.jar:2.16.0] at org.apache.camel.impl.DefaultCamelContext.addService(DefaultCamelContext.java:1166) ~[camel-core-2.16.0.jar:2.16.0] at org.apache.camel.impl.DefaultCamelContext.getEndpoint(DefaultCamelContext.java:583) ~[camel-core-2.16.0.jar:2.16.0] ... 38 common frames omitted Caused by: 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:616) ~[camel-core-2.16.0.jar:2.16.0] ... 47 common frames omitted

问题是 JAXP TransformerImpl 中不存在 setMessageEmitter() 方法。

如果有人有任何将 Saxon-PE/EE 与 Camel 集成的经验,我将不胜感激。我需要 Saxon-PE 才能利用 xsl 样式表中的外部函数调用。以前,在同一个项目中,我使用过 Saxon-HE(通过camel-saxon maven 依赖项),没有任何问题。只有切换到 Saxon-PE 时才会出现此问题。

我可以提供任何可能有帮助的其他详细信息。提前致谢。

最佳答案

Saxon 基本上具有三层接口(interface)。第 1 层是公共(public) API,包括 JAXP 和 XQJ 接口(interface)以及 s9api 接口(interface)。我们非常努力地保持这些跨版本的兼容性。第 2 层是“系统编程接口(interface)”——级别稍低一些,但集成商经常需要的东西——例如 NodeInfo 和 Receiver 接口(interface)。 Saxon 主要版本之间的 SPI 通常会有一些小变化(例如 9.5 到 9.6,或 9.6 到 9.7)。对于维护版本(例如 9.5.0.7 至 9.5.0.8),我们尽力避免任何不兼容的更改。即使在主要版本中,我们也会尽力避免对 SPI 进行无端更改,但如果架构上有必要,我们会进行更改。例如,在 9.6 之前,我们在 Receiver 接口(interface)中将位置信息(系统 ID、行号和列号)公开为全局唯一整数。但是在 XSLT 3.0 以及 Saxon 9.7 中引入单独编译的包意味着这种设计变得行不通,因此我们转而传递 Location 对象。尽管这些更改很小,但足以确保使用 Saxon 且偏离稳定的公共(public) API 的应用程序通常至少需要重新编译才能与新的 Saxon 版本一起使用。

第三层由内部API组成:一个例子是编译器构建的表达式树的结构。尽管某些第三方应用程序(例如调试器或性能分析器)可能需要访问此类接口(interface),但我们不会尝试使它们从一个主要版本到下一个主要版本保持兼容。

我认为 9.5 和 9.6 之间影响 Camel 的特定变化可能是由于内部 Controller 类不再充当 JAXP Transformer 接口(interface)的实现类(因此将 Transformer 转换为 Controller 不再有效)。多年来,当 Controller 还执行各种其他功能时,维护该角色的问题已经慢慢增加;与此同时,JAXP 转换接口(interface)(牢固地基于 XSLT 1.0)对于 Saxon 正在做的新事物来说越来越外围,是时候阻止它成为我们内部设计的约束了。

我一直认为,我们必须平衡让用户轻松前进的需求和防止代码库结构衰退(从而导致不可靠性)的需求。随着产品的成熟,稳定性变得越来越重要,但流式传输和模块化编译等新设施在架构上具有颠覆性,我们不想停滞不前。

我们始终准备向确实遇到困难的用户提供旧版本。

关于java - 将 Saxon-PE 与 Apache Camel 结合使用,预加载 Saxon 类时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34599874/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com