2016-05-17 20 views
6

我试图在我的代码库中找到支持2个不同版本的API的方法。它们具有相同的软件包名称,但在引擎盖下工作方式差异很大(两个完全不同的系统)。我怎样才能做到这一点?在Java中支持2个版本的API

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

+2

您可以使用工具来重命名包,即使在内置的jar中,或者您可以使用类似OSGi的东西(重命名包更容易) –

+0

您打算如何在自己的代码中使用这些库? 2个不同的版本意味着2个不同的方法签名(例如)...您必须制作2个不同版本的应用程序...我在这里没有看到任何其他选择... – Pras

+1

@PeterLawrey您使用过什么工具或做过什么你知道吗?我刚刚找到一个名为“Jar Jar Links”的人似乎这样做。 – Rob

回答

1

我将从头开始的解决方案是将API加载到自定义类加载器中,该加载器首先将子类加载到父类上。如果你在API中编译Bouncy Castle,那么你不需要担心单独加载它。如果您在运行时动态加载Bouncy Castle jar,那么在自定义类加载器中,您会将Bouncy Castle和您的API添加到该类加载器。使用URLClassLoader并查看我的链接以下是父上次加载的链接。

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?

0

您可以创建自定义类加载器,以根据加载API版本所需的逻辑加载相应的类。

2

我不建议这一点,除非你知道自己在做什么,但你可以使用一个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

+0

这并没有考虑到他加载Bouncy Castle单独版本的主要问题,以及来自其API的多个版本的相同类。你的方法仍然会首先加载,如果没有正确编程,将会产生ClassNotFound影响。 – Underbalanced