在正确声明了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文件吗?
谢谢。
答案 0 :(得分:1)
从技术上讲,Saxon不需要将外部类放在类路径中-它要求可以使用适当的ClassLoader对其进行访问。如果您了解ClassLoader并且准备编写自己的产品或配置第三方产品,则可以从任何地方加载类。如果您想做这样的事情,撒克逊人所有的钩子都在那里。但是产品没有包装。
您可以尝试的一些事情包括:
Configuration.setDynamicLoader()
,您可以更改Saxon动态加载外部类(包括用于Java扩展功能的类)的方式。Configuration.getDynamicLoader().setClassLoader()
,您可以提供用于加载类的其他ClassLoader,例如URLClassLoader。ProfessionalConfiguration.setExtensionBinder("java", XXX)
,您可以注册自定义的JavaExtensionLibrary,通常将其作为标准类的子类,从而允许您更改URI映射到Java类的方式以及选择方法的方式(例如)这都是非常底层的系统编程,并不适合胆小的人。