java - 使用 Saxon 通过 XQuery 加载外部 java 函数

标签 java saxon

当使用 Saxon 执行 xquery 时,当它们被正确声明时(通过指向包和类的命名空间),我可以访问 Java 类和方法,但我想知道是否有一种方法可以在每次运行时创建一种“动态”类路径加载外部 jar 文件并在其中搜索类,而不是在当前项目/程序类路径中(因为我无法在其中添加所有可能的类)。 例如我有这样的东西:

declare namespace dpr="java:com.*****.atm.dpr.common.util.DPRConfigurationLoader";
declare variable $rules as node()* := doc(dpr:getApplicationProperty('Common','RulesFileLocation'))//category;

我可以用模拟版本替换真实类的路径,但这意味着我必须在我这边创建每个可能的类(这并不是一个好方法,因为它意味着每个新的 java 调用的“补丁”...)。

因此,如果我提供一个包含我需要的类的 jar,是否有办法加载它以便命名空间指向它? 我知道我可以加载 .class 文件(如果它们位于类路径上),但完全是 3 个 jar 文件?

谢谢。

最佳答案

从技术上讲,Saxon 不要求外部类位于类路径上 - 它要求可以使用适当的类加载器来访问它们。如果您了解类加载器并准备编写自己的或配置第三方产品,那么您可以从任何地方加载类。如果你想做这样的事情,撒克逊人有所有的钩子(Hook);但产品包装中没有任何东西。

您可以尝试的一些方法包括:

  • Configuration.setDynamicLoader()您可以更改 Saxon 动态加载外部类的方式,包括用于 Java 扩展函数的类。
  • Configuration.getDynamicLoader().setClassLoader()您可以提供不同的 ClassLoader 来加载类,例如 URLClassLoader。
  • ProfessionalConfiguration.setExtensionBinder("java", XXX)您可以注册一个自定义的 JavaExtensionLibrary,通常作为标准 JavaExtensionLibrary 的子类,允许您更改 URI 映射到 Java 类的方式以及选择方法的方式(例如)

这都是非常低级的系统编程,不适合胆小的人。

关于java - 使用 Saxon 通过 XQuery 加载外部 java 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52099975/

相关文章:

xslt - XSL/Saxon 排序规则/命令行

xml - XSLT 使用 Saxon 更改属性命名空间

java - 无法使用 JDBC 驱动程序连接到本地主机上的 MySQL

java - 如何以编程方式将多个 ImageView 添加到 Framelayout?

java - Gxt 3.0.0 支持的 Gxt 3.1.1 实现 Dialog.getHideButton() 的方法是什么?

java - 我如何更改此代码以使用户同时输入月份和年份而不是仅仅在输入月份时停止?

java - 使用 Saxon9he 进行 XSLT 转换抛出 java.net.URISyntaxException : Illegal character in path at index

json - JSON 中的 XML 序列化,无需过多转义

javascript - SAXON 错误 - 如何忽略/跳过它?

java - 我不知道 BigIntegers 哪里出了问题