当正确声明(通过命名空间指向包和类)时,我可以在使用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不需要外部类在类路径上 - 它需要使用适当的ClassLoader访问它们。如果您了解ClassLoaders并准备编写自己的或配置第三方产品,那么您可以从任何地方加载类。如果你想做这些事,萨克森的所有钩子都在那里;但是产品没有包装。
您可以尝试的一些事情包括:
Configuration.setDynamicLoader()
,您可以改变Saxon动态加载外部类的方式,包括用于Java扩展函数的类。Configuration.getDynamicLoader().setClassLoader()
,您可以为加载类提供不同的ClassLoader,例如URLClassLoader。ProfessionalConfiguration.setExtensionBinder("java", XXX)
,您可以注册一个自定义的JavaExtensionLibrary,通常作为标准的子类,允许您更改URI映射到Java类的方式以及选择方法的方式(例如)这都是非常低级的系统编程,不适合胆小的人。