Maven:一个 JVM 中的不同库版本

use*_*246 5 java maven

我有一个项目,其依赖关系树很大,即它包含来自多个团队的模块。

现在有一些常用的依赖关系,它们在多个模块中是通用的。

一个简化的例子可以是:

TopModule.jar
  ChildModule.jar
    CommonModule-v1.jar
  CommonModule-v2.jar
Run Code Online (Sandbox Code Playgroud)

当我构建项目时,我指定了公共依赖项的最新版本,但很难向其他每个团队提出相同的要求。

因此,TopModule 通常是使用不同版本的 CommonModule 构建的(上例中的 v1 和 v2)。

我的问题是:

如果最终的 jar 文件同时包含 CommonModule-v1.jar 和 CommonModule-v2.jar,它对运行时有何影响?

运行时是否会错误地加载需要 v1 的版本 v2,反之亦然?

sse*_*ano 0

如果您的 pom.xml 只是已打包模块的聚合器,那么这适用。如果情况并非如此,并且您的项目实际上将所有这些模块编译并打包为子模块,那么 maven 将选择一个。如果它自己编译每个项目,那么它将使用该依赖项进行打包。但如果它们最终都在同一个类加载器中,那么它就无法正常工作。

在运行时它可能会导致错误、思考method not found等。您的字节码类已编译并与正确的依赖项链接,但由于类加载器找到了两个候选者,因此它只在运行时加载一个。

您可以做的是设置一个定义 a 的父 pom <dependencyManagement>,然后要求所有团队将其用作父项,并且不声明<version>而是从父 pom.xml 继承它。

参考文献http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Management