【问题标题】:Integrate Saxon-PE in Camel using camel-saxon使用 camel-saxon 将 Saxon-PE 集成到 Camel 中
【发布时间】:2019-01-25 16:11:19
【问题描述】:

我使用 Camel 2.22.1 和 springboot 2.0.4.RELEASE。骆驼组件camel-saxon 使用默认的 Saxon-HE。我有一些调用 Java 方法的 Xquery 文件,所以我想用 Saxon-PE 替换 Saxon-HE。我为 Saxon-PE 申请了一份测试许可证,并尝试了不同的方法,但没有成功。 Saxon-PE jar 文件saxon9pe.jar 已经加载,但是,它仍然作为 Saxon HE 版本运行。我想,Saxon-PE 没有正确加载许可证。

我尝试了以下方法,它们都没有奏效。

  • 将许可文件saxon-license.licsaxon9pe.jar放在同一个文件夹中
  • 定义环境变量SAXON_HOME,将saxon-license.licsaxonpe.jar放入SAXON_HOME\bin中
  • 修改org.apache.camel.component.xquery.XQueryBuilder.configuration在类XqueryBuild.java在包org.apache.camel.component.xquery设置LICENSE_FILE_LOCATION(我得到错误:未知的配置属性http://saxon.sf.net/feature/licenseFileLocation

Saxon 文档中提到要创建一个 XML 配置文件,但我不知道我应该把这个 XML 配置文件放在哪里。

使用 Java 调用运行 Xquery 时出现错误:

Caused by: net.sf.saxon.trans.XPathException: Cannot find a 0-argument function named Q{java:java.lang.Double}MAX_VALUE(). Reflexive calls to Java methods are not available under Saxon-HE at net.sf.saxon.query.UnboundFunctionLibrary.bindUnboundFunctionReferences(UnboundFunctionLibrary.java:166) ~[saxon9pe.jar!/:na] at net.sf.saxon.query.QueryModule.bindUnboundFunctionCalls(QueryModule.java:1172) ~[saxon9pe.jar!/:na] at net.sf.saxon.expr.instruct.Executable.fixupQueryModules(Executable.java:462) ~[saxon9pe.jar!/:na] at net.sf.saxon.query.XQueryParser.makeXQueryExpression(XQueryParser.java:176) ~[saxon9pe.jar!/:na] at net.sf.saxon.query.StaticQueryContext.compileQuery(StaticQueryContext.java:597) ~[saxon9pe.jar!/:na] at net.sf.saxon.query.StaticQueryContext.compileQuery(StaticQueryContext.java:658) ~[saxon9pe.jar!/:na] at org.apache.camel.component.xquery.XQueryBuilder$3.createQueryExpression(XQueryBuilder.java:276) ~[classes!/:2.23.1] at org.apache.camel.component.xquery.XQueryBuilder.initialize(XQueryBuilder.java:745) ~[classes!/:2.23.1] at org.apache.camel.component.xquery.XQueryBuilder.evaluateAsDOM(XQueryBuilder.java:190) ~[classes!/:2.23.1] at org.apache.camel.component.xquery.XQueryBuilder.evaluate(XQueryBuilder.java:151) ~[classes!/:2.23.1] ... 40 common frames omitted

可以分享一些使用 Camel 设置 Saxon-PE 以在 Xquery 中调用 Java 的经验吗?

谢谢!

【问题讨论】:

  • 知道它是如何失败的会很有用。具体来说,我们需要确定它是找到 Saxon-PE jar 文件并尝试执行它(但失败),还是找不到 Saxon-PE jar 文件。了解症状将有助于区分这两种情况。
  • 请注意,该问题与stackoverflow.com/questions/34599874/… 重复,因此某些 SO 成员可能倾向于将其作为重复项关闭;我不愿意这样做,因为自 2016 年以来答案可能已经发生了变化。
  • 如果 Xquery 不需要 Saxon PE 中的功能,那么一切都很好。如果在我尝试执行 Xquery 时失败,其中调用了 Java 方法。即使是撒克逊文档中的简单示例<a xmlns:double="java:java.lang.Double"> {double:MAX_VALUE()} </a>
  • 使用 Java 调用运行 Xquery 时的错误是:Caused by: net.sf.saxon.trans.XPathException: Cannot find a 0-argument function named Q{java:java.lang.Double}MAX_VALUE(). Reflexive calls to Java methods are not available under Saxon-HE at net.sf.saxon.query.UnboundFunctionLibrary.bindUnboundFunctionReferences(UnboundFunctionLibrary.java:166) ~[saxon9pe.jar!/:na] 我确定 saxon9pe.jar 已加载并使用,但相信它的行为与 Saxon HE 相同,因为许可证不正确已加载。

标签: apache-camel saxon


【解决方案1】:

从提供的额外信息来看,您似乎选择的是 Saxon JAR 文件,而不是许可证文件。

将许可证文件与 JAR 文件放在同一文件夹中通常就足够了,但它仅适用于某些类加载器。

一般来说,您要么需要确保包含 JAR 文件的目录位于类路径中,要么需要(以某种方式)设置 Saxon 的配置属性 LICENSE_FILE_LOCATION。

根据https://github.com/apache/camel/blob/master/components/camel-saxon/src/main/docs/xquery-component.adoc,您可以使用configurationconfigurationProperties 设置Saxon 配置属性,但我没有看到任何关于其工作原理的进一步解释。我会四处挖掘。

【讨论】:

  • 你是对的,将许可证文件和 JAR 文件放在同一个文件夹中仅适用于 一些 类加载器。而且我使用Spring提供的类加载器,它不起作用。我试图设置 Saxon 的配置属性LICENSE_FILE_LOCATION。 if (configuration == null) { configuration = new Configuration(); configuration.setConfigurationProperty(Feature.LICENSE_FILE_LOCATION, "path2LicenseFile");但我得到了错误:错误:未知的配置属性saxon.sf.net/feature/licenseFileLocation
  • 你需要new ProfessionalConfiguration()而不是new Configuration()
  • 非常感谢。我应该使用ProfessionalConfiguration() 而不是Configuration()
猜你喜欢
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 2018-08-18
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多