Java 扩展函数和类路径

Java 扩展函数和类路径,java,xslt,classpath,saxon,Java,Xslt,Classpath,Saxon,我知道这是一篇很长很详细的文章。如果可以的话,我会把它缩短和简化。如果有任何建议或想法,我将不胜感激 背景 我正在编写XSLT来在两个应用程序之间传输数据——称它们为源和目标。 我的XSLT由源系统的供应商提供的集成引擎调用—称它们为Source Co 集成引擎通过调用引擎中包含的适配器来更新目标,该适配器封装了目标系统供应商编写的API—称为Target Co。这一切都在J2EE服务器内运行 当集成引擎部署到javaee服务器时,它复制实现目标系统API的JAR文件,以便它位于引擎的类路径上

我知道这是一篇很长很详细的文章。如果可以的话,我会把它缩短和简化。如果有任何建议或想法,我将不胜感激

背景

我正在编写XSLT来在两个应用程序之间传输数据——称它们为源和目标。 我的XSLT由源系统的供应商提供的集成引擎调用—称它们为Source Co

集成引擎通过调用引擎中包含的适配器来更新目标,该适配器封装了目标系统供应商编写的API—称为Target Co。这一切都在J2EE服务器内运行

当集成引擎部署到javaee服务器时,它复制实现目标系统API的JAR文件,以便它位于引擎的类路径上

我的处境

封装目标公司API的源公司适配器只公开API的子集。有时,我的客户的业务需求只能通过绕过源协同适配器并直接从JAVA调用API来满足

我已经通过以下方式实现了这一目标:

  • 编写接受和返回DOM文档并调用API的Java类
  • 将它们作为jar部署到javaee引擎中,这样它们将位于集成引擎可见的类路径上,因此也就是我的XSLT
  • 在我的XSLT中,我通过声明一个名称空间指向Java类,然后通过该名称空间调用适当的公共静态方法
这一切都很好。然而

我的问题

目标公司API的最新版本包括:

  • 删除了几个不推荐的方法
  • 对目标系统中其他业务实体的公开访问
源Co的适配器使用这些删除的方法,因此它需要在其类路径上有一个旧版本的目标Co API

客户的最新业务需求只能通过使用最新API访问这些附加业务实体来满足

我的问题

如果扩展函数的类路径上没有集成引擎适配器的类路径,那么如何在扩展函数的类路径上有最新版本的API

当然,我可以使用自定义类装入器。我这样做是为了加载一个第三方数据库驱动程序jar,如果它在类路径上,它也会破坏集成引擎。在数据库驱动程序的情况下,这涉及到只使用自定义类加载器一次。然而,在目前的情况下,我看不出如何避免对类加载器的大量调用充斥在我的代码中,这感觉非常错误

一些技术细节

源系统-SAP

目标系统-Oracle的Primavera

Java EE引擎-Netweaver 7.2


XSLT Processor-Saxon

在细节方面,我不太了解,但人们告诉我,在应用程序的不同部分使用同一组件的多个版本的方法是使用OSGi。@Michael-无论如何,谢谢。再想一想,除了使用自定义类装入器路径之外,我没有其他选择。所有东西都在同一个JVM中运行,除了调用shell之外,我没有任何地方可以干预——这比自定义类装入器更糟糕。我将重点讨论如何清晰地考虑这种方法。顺便说一句:我最近买了你的书,这样我就不用再问关于Stackoverflow的愚蠢问题了。非常非常好,谢谢你。我讨厌去想写这本书花了多少个小时。