在 Java 中支持 API 的 2 个版本

Supporting 2 versions of an API in Java

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

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

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

我要开始的解决方案是...将 API 加载到自定义 class 加载器中,该加载器首先在父 class 上加载子 class。如果您在 API 内编译 Bouncy Castle,那么您就无需担心单独加载它。如果您在 运行 时间内动态加载 Bouncy Castle jar,那么在自定义 class 加载器中,您将添加 Bouncy Castle 和您的 API 到那个 class 加载器。使用 URLClassLoader 并在下面查看我的 link 以了解父级上次加载。

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?

除非您知道自己在做什么,否则我不推荐这样做,但您可以按如下方式使用 URLClassLoader

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

加载 class:

classLoaderA.loadClass("SomeClass");

另一种选择是查看 OSGI