【问题标题】:Supporting 2 versions of an API in Java支持 2 个 Java 版本的 API
【发布时间】:2016-05-17 12:58:54
【问题描述】:

我正在尝试在我的代码库中找到一种方法来支持 2 个不同版本的 API。它们具有相同的包名称,但在底层的工作方式却大不相同(两个完全不同的系统)。我怎样才能做到这一点?

这两个 API 都依赖于 Bouncy Castle,但它们使用不同的版本。我如何也考虑到这一点?

【问题讨论】:

  • 你可以使用工具来重命名包,即使是在内置的 jar 中,或者你可以使用 OSGi 之类的东西(重命名包更容易)
  • 您打算如何在自己的代码中使用这些库? 2 个不同的版本意味着 2 个不同的方法签名(例如)......您必须制作 2 个不同版本的应用程序......我在这里看不到任何其他选择......
  • @PeterLawrey 您使用过或知道哪些工具?我刚刚发现一个名为“Jar Jar Links”的似乎可以做到这一点。
  • @Pras 当我需要与旧系统通信时,我将使用旧 API,当我需要与新系统通信时,我将使用新 API。该应用程序的 2 个版本无法运行。
  • 您的应用程序是某种网络服务吗? RESTfull 服务?在这种情况下,2 个不同的端点可以解决问题……或者,我不知道您将如何区分旧系统和新系统……您是否能够在第一个系统中区分这两个系统地点?

标签: java configuration-management


【解决方案1】:

除非您知道自己在做什么,否则我不建议您这样做,但您可以使用URLClassLoader,如下所示:

URLClassLoader classLoaderA = URLClassLoader.newInstance(new URL[] {new URL("versionA.jar")});
URLClassLoader classLoaderB = URLClassLoader.newInstance(new URL[] {new URL("versionB.jar")});

加载类:

classLoaderA.loadClass("SomeClass");

另一种选择是查看OSGI

【讨论】:

  • 这并没有说明他从 API 加载不同版本的 Bouncy Castle 以及相同类的多个版本的主要问题。您的方法仍将先加载 Parent,如果未正确编程,则会产生 ClassNotFound 影响。
【解决方案2】:

我要开始的解决方案是... 将 API 加载到自定义类加载器中,该加载器首先将子类加载到父类之上。如果您在 API 中编译 Bouncy Castle,则无需担心单独加载它。如果您在运行时动态加载 Bouncy Castle jar,那么在自定义类加载器中,您需要将 Bouncy Castle 和您的 API 添加到该类加载器。使用URLClassLoader 并在下面查看我的链接以获取 Parent last loading。

How do I create a parent-last / child-first ClassLoader in Java, or How to override an old Xerces version that was already loaded in the parent CL?

【讨论】:

    【解决方案3】:

    您可以创建一个自定义类加载器,以根据加载一个 API 版本与另一个版本所需的逻辑来加载适当的类。

    【讨论】:

      猜你喜欢
      • 2020-05-11
      • 2014-06-12
      • 2015-09-01
      • 2017-04-07
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多