如何使用父项目中隐式管理的传递依赖项?

问题描述:

有一个dep库我的项目的模块之一(module1)依赖于。依赖关系在父级的dependencyManagement部分中声明。如何使用父项目中隐式管理的传递依赖项?

... 
<groupId>group1</groupId> 
<artifactId>parent-proj</artifactId> 
... 
<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>group2</groupId> 
      <artifactId>dep</artifactId> 
      <version>1</version> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 
... 


... 
<parent> 
    <groupId>group1</groupId> 
    <artifactId>parent-proj</artifactId> 
    ... 
</parent> 
<artifactId>module1</artifactId> 
... 
<dependencies> 
     <dependency> 
      <groupId>group2</groupId> 
      <artifactId>dep</artifactId> 
     </dependency> 
</dependencies> 
... 

dep又取决于subdep,我想在另一个模块(module2)的依赖关系,使用来自相同parent-proj继承。重点是使module2使用相同版本的subdepdep取决于没有明确声明我的项目中的版本。然而,当我尝试添加上subdep的依赖到module2的Maven不知道是什么版本的subdep必须使用:

... 
<parent> 
    <groupId>group1</groupId> 
    <artifactId>parent-proj</artifactId> 
    ... 
</parent> 
<artifactId>module2</artifactId> 
... 
<dependencies> 
     <dependency> 
      <groupId>group2</groupId> 
      <artifactId>subdep</artifactId> 
     </dependency> 
</dependencies> 
... 
module2$ mvn dependency:tree 
... 
[ERROR]  'dependencies.dependency.version' for group2:subdep:jar is missing 
... 

是否有子项目传递依赖使用方式在父项目中隐式管理?

由于dependencyManagement只定义约束(如版本),而不是真正的dependencies,为什么不把版本对齐放在共享父pom中?

更新依赖版本可能会让人觉得奇怪,但是如果您没有时间找到原因或实际解决问题,那么如何解决失败的构建问题。

dep所有者可以升级有关subdep其版本的依赖,即使没有让你通过dep版本增量知道。你构建得不可重现。

如果您的模块依赖于版本1的subdep的API,那么您通常希望对版本2执行“受控迁移”。如果没有任何更改,也许没有理由在第一个版本中增加版本号地点。

为了减轻疼痛,我建议看看到Maven版本插件:

有关如何告诉Maven来“只使用最新的”的讨论,参见:

+0

因为如果我决定切换到'dep'的版本2,这取决于'subdep'的更新版本,这样'subdep'的显式定义的版本将会覆盖'dep' v.2依赖树中'subdep'的版本。因此,每次更改“dep”版本时,都必须手动重新对齐显式定义。 – vect

+0

@vect我已经更新了我的答案。 “ –

+0

”dep的所有者可能会升级其对subdep的版本依赖关系,即使不通过dep的版本增量让您知道,您的构建也将无法重现。“ - 另一方面,在'dependencyManagement'中覆盖'subdep'的一个版本我可能会冒一个错误的版本,因为它不包含'dep'所需的'subdep'版本。而且由于构建时没有错误,只有在集成测试或运行时才会发现构建的不一致性。 – vect