我有一个项目,其依赖关系树很大,即它包含来自多个团队的模块。
现在有一些常用的依赖关系,它们在多个模块中是通用的。
一个简化的例子可以是:
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,反之亦然?
如果您的 pom.xml 只是已打包模块的聚合器,那么这适用。如果情况并非如此,并且您的项目实际上将所有这些模块编译并打包为子模块,那么 maven 将选择一个。如果它自己编译每个项目,那么它将使用该依赖项进行打包。但如果它们最终都在同一个类加载器中,那么它就无法正常工作。
在运行时它可能会导致错误、思考method not found等。您的字节码类已编译并与正确的依赖项链接,但由于类加载器找到了两个候选者,因此它只在运行时加载一个。
您可以做的是设置一个定义 a 的父 pom <dependencyManagement>,然后要求所有团队将其用作父项,并且不声明<version>而是从父 pom.xml 继承它。
| 归档时间: |
|
| 查看次数: |
3583 次 |
| 最近记录: |