我知道这是一篇相当长且详细的帖子。如果可以的话,我会让它更短更简单。我将不胜感激任何建议或想法。
背景
我正在编写 XSLT 以在两个应用程序之间传输数据 - 称它们为 Source 和 Target。我的 XSLT 由 Source System 供应商提供的集成引擎调用 - 称他们为 Source Co。
集成引擎通过调用包含在引擎中的适配器来更新 Target,该适配器包装了由 Target 系统的供应商编写的 API - 将它们称为 Target Co。这一切都在 J2EE 服务器内运行。
当集成引擎部署到 Java EE 服务器时,它会复制实现目标系统 API 的 JAR 文件,以便它位于引擎的类路径中。
我的情况
Source Co 的 Adapter 封装了 Target CO 的 API,只公开了 API 的一个子集。有时,我的客户的业务需求只能通过绕过 Source Co Adapter 并直接从 JAVA 调用 API 来满足。
我已经通过以下方式实现了这一目标:
- 编写接受和返回 DOM 文档并调用 API 的 Java 类
- 将它们作为 JAR 部署到 Java EE 引擎中,以便它们位于集成引擎可见的类路径上,因此我的 XSLT
- 在我的 XSLT 中,我通过声明命名空间来指向 Java 类,然后通过该命名空间调用适当的公共静态方法
这一切都很好。然而...
我的问题
Target Co 的 API 的最新版本具有:
- 删除了几个不推荐使用的方法
- 公开访问目标系统中的其他业务实体
Source Co 的适配器使用这些已删除的方法,因此它的类路径中需要有旧版本的 Target Co API。
只有使用最新的 API 访问这些额外的业务实体,才能满足客户的最新业务需求。
我的问题
我如何才能在我的扩展函数的类路径上拥有最新版本的 API,而不是它位于集成引擎适配器的类路径上?
我当然可以使用自定义类加载器。我这样做是为了加载一个 3rd 方数据库驱动程序 jar,如果它在其类路径上,它也会破坏集成引擎。在数据库驱动程序的情况下,这仅涉及使用一次自定义类加载器。然而,在目前的情况下,我看不出如何避免对类加载器的许多调用在我的代码中乱七八糟,这感觉非常错误。
一些技术细节
源系统 - SAP
目标系统 - Oracle 的 Primavera
Java EE 引擎 - Netweaver 7.2
XSLT 处理器 - 撒克逊