我有一个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
}
这将在运行时使用!
答案 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)