我很难理解maven依赖树在发布x管理版本时会发生什么;省略重复。
例如,假设我在enterprise-data-2.4
的依赖关系管理部分中定义了server-a
。
我在server-a
的依赖关系树中为其中一个依赖server-b
拉入enterprise-data-2.4
获得了以下内容。
[INFO] +- hello.world.welcome.to:server-b:jar:3.1-SNAPSHOT:runtime
[INFO] | +- (hello.world.where.am: enterprise-data:jar:2.4:runtime - version managed from 3.0; omitted for duplicate)
假设server-b
是enterprise-data-2.4
唯一的内容,我的理解是server-a
将始终在此处enterprise-data-2.4
。这是对的吗?
但是,server-b
中的代码依赖于enterprise-data-3.0
而server-b
对enterprise-data-3.0
具有编译时依赖性。
现在,我有一个测试项目,让我们说test-b
测试server-b
项目中存在的server-a
jar,并且对enterprise-data-3.0
具有测试依赖性。这些测试直接命中server-a
上的代码。
当我在test-b
中运行我的测试时,如果我尝试访问enterprise-data-3.0
中存在的功能时会出现错误,因为server-a
没有提及或者它会通过因为enterprise-data-3.0
存在测试依赖性?它目前通过,但我不确定测试依赖是否足够。
请帮我理解。
修改:我正在使用maven-3
。
感谢。
答案 0 :(得分:3)
例如,假设我在server-a的依赖关系管理部分中定义了 enterprise-data-2.4 。
然后你总是得到2.4,即使只有JAR依赖于1.8。依赖关系管理会覆盖依赖关系中介。
假设 server-b 是唯一一个拉入 enterprise-data-2.4 的jar,我的理解是 server-a 总会拉在 enterprise-data-2.4 这里。这是对的吗?
假设您没有依赖关系管理,那么是的。如果存在多个依赖于不同版本的依赖关系,则根据Maven版本的依赖关系中介规则>,首先加载哪一个(及其传递依赖关系)的问题。 2.0.9。其他人将:"从x管理并省略重复"。
当我在 test-b 中运行我的测试时,如果我在尝试访问 enterprise-data-3.0 中存在的功能时会出现错误,因为它不是由 server-a 引入或者是否会通过,因为 enterprise-data-3.0 存在测试依赖性?它目前通过,但我不确定测试依赖是否足够。
如果它使用不兼容的代码拉错了版本,是的,您会看到错误。对于Maven 3,使用3.0定义测试范围依赖关系并使用2.4编译范围依赖关系将意味着Maven会覆盖2.4并使用在测试范围上定义的较新版本。有关详细信息,请参阅this question and its answers。
尽管如此,您始终可以在 test-b 中使用依赖关系管理来修复您要使用的每个依赖项的版本。