使用 Saxon 通过 XQuery 加载外部 java 函数
Load external java function through XQuery with Saxon
我可以在使用 Saxon 执行 xquery 时访问 Java class 和方法,只要它们被正确声明(通过指向包的命名空间和 class),但我想知道是否有在每个 运行 加载外部 jar 文件时创建一种 "dynamic" class 路径并在其中搜索 classes 而不是在当前 project/program classpath(因为我无法在其中添加所有可能的 class)。
所以例如我有类似的东西:
declare namespace dpr="java:com.*****.atm.dpr.common.util.DPRConfigurationLoader";
declare variable $rules as node()* := doc(dpr:getApplicationProperty('Common','RulesFileLocation'))//category;
我可以用模拟版本替换真实 class 的路径,但这意味着我必须在我这边创建每个可能的 class (这不是一个好方法,因为它意味着 "patch" 对于每个新的 java 调用...)。
所以如果我提供一个包含 classes 的 jar,我需要有没有办法加载它以便命名空间指向它?
我知道我可以加载 .class 文件,如果它们在 class 路径上,但完全是 3 个 jar 文件?
谢谢。
从技术上讲,Saxon 不需要外部 类 在类路径上 - 它要求它们可以使用适当的类加载器访问。如果您了解类加载器并准备编写自己的或配置第三方产品,那么您可以从任何地方加载 类。如果你想做这样的事情,所有的钩子都在撒克逊语中;但是产品没有包装。
您可以尝试的一些方法包括:
- 使用
Configuration.setDynamicLoader()
,您可以更改 Saxon 动态加载外部 类 的方式,包括用于 Java 扩展函数的 类。
- 使用
Configuration.getDynamicLoader().setClassLoader()
,您可以提供不同的类加载器来加载 类,例如 URLClassLoader。
- 使用
ProfessionalConfiguration.setExtensionBinder("java", XXX)
,您可以注册自定义的 JavaExtensionLibrary,通常作为标准扩展库的子类,允许您更改 URI 映射到 Java [=29 的方式=] 和选择方法的方式(例如)
这都是非常低级的系统编程,不适合胆小的人。
我可以在使用 Saxon 执行 xquery 时访问 Java class 和方法,只要它们被正确声明(通过指向包的命名空间和 class),但我想知道是否有在每个 运行 加载外部 jar 文件时创建一种 "dynamic" class 路径并在其中搜索 classes 而不是在当前 project/program classpath(因为我无法在其中添加所有可能的 class)。 所以例如我有类似的东西:
declare namespace dpr="java:com.*****.atm.dpr.common.util.DPRConfigurationLoader";
declare variable $rules as node()* := doc(dpr:getApplicationProperty('Common','RulesFileLocation'))//category;
我可以用模拟版本替换真实 class 的路径,但这意味着我必须在我这边创建每个可能的 class (这不是一个好方法,因为它意味着 "patch" 对于每个新的 java 调用...)。
所以如果我提供一个包含 classes 的 jar,我需要有没有办法加载它以便命名空间指向它? 我知道我可以加载 .class 文件,如果它们在 class 路径上,但完全是 3 个 jar 文件?
谢谢。
从技术上讲,Saxon 不需要外部 类 在类路径上 - 它要求它们可以使用适当的类加载器访问。如果您了解类加载器并准备编写自己的或配置第三方产品,那么您可以从任何地方加载 类。如果你想做这样的事情,所有的钩子都在撒克逊语中;但是产品没有包装。
您可以尝试的一些方法包括:
- 使用
Configuration.setDynamicLoader()
,您可以更改 Saxon 动态加载外部 类 的方式,包括用于 Java 扩展函数的 类。 - 使用
Configuration.getDynamicLoader().setClassLoader()
,您可以提供不同的类加载器来加载 类,例如 URLClassLoader。 - 使用
ProfessionalConfiguration.setExtensionBinder("java", XXX)
,您可以注册自定义的 JavaExtensionLibrary,通常作为标准扩展库的子类,允许您更改 URI 映射到 Java [=29 的方式=] 和选择方法的方式(例如)
这都是非常低级的系统编程,不适合胆小的人。