同时运行同一功能的多个版本

时间:2016-08-03 12:19:50

标签: java scala jvm

上下文

运行同一个库的多个版本似乎是一种常见的需求,在处理版本化的jar 依赖项时,有很多问题。

但是,我在这里有另一个约束:我的代码是滚动释放MOAB的一部分,其中代码没有版本。我不能依赖MOAB的旧版本库。

该问题的用例是能够在运行时加载相同代码的不同版本以实现兼容性。

例如:GET /my/api/call?compat_version=42

我必须能够提供几个兼容版本(即来自 x 代码,但尚未更改)。这必须是当 x 版本是当前/最新版本时运行的实际代码,而不是任何类型的反向兼容技巧。

天真的解决方案

“明显”的方式似乎复制了每个版本的代码。例如,通过使用每个版本的包:

  • com.me.thing.v1
  • com.me.thing.v2
  • com.me.thing.v3
  • ...

并通过任何技术在提供的compat_version参数上动态加载关联包中的代码。让我们假设知道所有这些版本共享一个公共接口(API)。

挑战

我想挑战它,也许找到比天真的解决方案更好的选择。

由于使用版本 x 中的确切代码是先决条件,我不相信我可以摆脱复制粘贴(但请告诉我,我错了)。

您会建议使用哪种技术作为简单(但不一定简单)且功能强大的实现?反射?依赖注入?

做这些事情有“好”的模式吗?有没有关于这方面的文献?

1 个答案:

答案 0 :(得分:1)

当Java开发时,这已经是一个老问题,因此Sun强调二进制兼容性(当然也存在于Solaris中)。这是平台提供的原始保证 - 您可以升级下面的位,应用程序将继续工作,不加修改。

在JVM世界中运行遗留代码的方法是运行完整的遗留应用程序。

多年来,许多隔离体系结构已经开发出来,并且达到了各种成熟度 - 就像OSGI和之前的许多其他部分 - 但是边缘情况和许多失败模式都有边缘情况。

不要在单个JVM中使用多个代码版本。它从来就不是一个设计目标,在重要的环境中只会导致痛苦。