不同版本的库加载到同一个ClassLoader

时间:2013-07-28 18:36:29

标签: java class classloader

Heyho,

假设我们有这样的设置:

申请 - > 插件 - >的模块

“插件”和“模块”依赖于“应用程序”。

应用程序使用库的1.0版本。 模块取决于相同的库,但版本2.0。类是相同的,但在2.0中删除了一些方法,并添加了一些方法。 插件使用应用程序的父ClassLoader和模块 插件的父ClassLoader。

现在的问题是该模块使用的是1.0版本的库,但它依赖于2.0 - > 例如找不到方法

解决这个问题的方法是什么?可行的方法是重新定位版本2.0,但可能在运行时期间有一个解决方法。也许可以更改类加载器来解决问题。

最高

1 个答案:

答案 0 :(得分:1)

您的选择是:

  1. 将应用程序升级到2.0
  2. 将插件降级为1.0(希望它仍能正常工作)
  3. 将应用程序“core”移动到嵌套的类加载器
  4. 更改插件/模块类加载器,使它们不是“父级”。请注意,这是一个非常粗略的选项,如果没有正确完成,可能会搞砸了。
  5. 选项3.看起来像:

    Application Base -> plugin -> module (lib 2.0)
                     -> Application Core (lib 1.0)
    

    这实质上使插件和应用程序核心同步,因此不再存在类加载器问题。