如何在运行时使用不同版本的库?

时间:2015-06-03 13:19:51

标签: java

我有一个java项目,我使用外部jar(不受我控制)。 到目前为止,每当该库的新版本出来时,我都会更新 我的项目使用的是最近的一个,但现在需要了 project使用该库的不同版本。

我的问题是我不知道如何做到这一点。 我如何告诉java根据jar的版本进行导入,

我需要做什么:

    int versionFlag = getVersion2use();
    if(verssionFlag = 0){
           use imports from last version
    }else if(verssionFlag = 1){
          use imports from last version 1
    } else if(verssionFlag = 2){
         use imports from last version 2
    }

这将在运行时使用!

3 个答案:

答案 0 :(得分:1)

这通常是项目在构建时执行的操作,而不是在运行时动态执行的操作。

那就是说,如何在运行时动态地将jar添加到系统类加载器,这是一个很好的答案,这可以用于上面的一般逻辑:

How should I load Jars dynamically at runtime?

关于进口产品,您无法动态选择进口产品。所以,如果你很幸运,这两个版本具有相同的基本API。如果成立,请在应用程序中尽早将jar添加到类加载器中,然后像平常一样进行开发。

但是,如果两个版本的API不同,那么您将不得不编写一些非常复杂的代码来尝试构建对象,几乎无处不在地捕获所有许多不同的类加载/类不兼容性异常(例如作为ClassNotFoundException)。更糟糕的是,您可能不得不在某种外观或工厂架构背后执行此操作,以便您可以实际保持运行的软件与所有这些类加载恶作剧隔离。简而言之,如果两者有不同的API,那么实际上最好不要写两个单独的产品。

答案 1 :(得分:0)

在运行时

同一个包中具有相同名称的类遵循第一个可用规则。类路径中的第一个是使用的那个。

在Java应用程序启动之前,如果没有包装程序将库移入和移出系统类路径,您将无法在运行时轻松地执行所需操作。

一个启动程序脚本/程序,它动态构建类路径,并且只包含每个库所需的版本并将其传递给java -cp,这是在运行时执行所需操作的唯一方法。

在构建时

如果是在构建时,那么只需使用Maven中的shade插件之类的内容来构建 uberjar ,其中所有必需的库都嵌入在单个.jar中每个版本。所以3个版本将是3个独立的uberjar组件。

答案 2 :(得分:-1)

如果您可以在 build 时间执行此操作,则可以使用依赖关系管理器,例如Maven

它为您提供了一种方法,可以在构建时选择使用哪个库的版本。

如果您需要在运行时执行此操作,则可能需要打包项目中的所有库。您可以使用着色(请参阅here)以确保不会导致导入问题,因为在导入不同版本的库时,您最终会得到类似的导入。

着色可以帮助您做出示例:

 com.foo.Class in jarv1
 com.foo.Class in jarv2

成为

 com.foo.v1.Class in jarv1
 com.foo.v2.Class in jarv2

这将确保您的代码仍然可以使用您想要的所有库。