1

我知道这是一篇相当长且详细的帖子。如果可以的话,我会让它更短更简单。我将不胜感激任何建议或想法。

背景

我正在编写 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 处理器 - 撒克逊

4

0 回答 0