我有一个Spring Boot应用程序(具有一个父pom),通常根据版本来管理大量依赖项。
如果我将其添加到我的pom.xml
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-dynamodb</artifactId>
</dependency>
并列出表示版本不是最新的依赖项:
./mvnw dependency:list | grep dynamo
[INFO] com.amazonaws:aws-java-sdk-dynamodb:jar:1.11.125:compile
在撰写本文时,最新版本是1.11.838
,我的当前版本是“过时”许多个月。
我的IDE通常会很好地向我展示在“托管”依赖项时,例如由父母pom。但是在这种情况下,并不表示确实如此。
我的想法也许是一种传递性依赖关系正在影响这一点,但是我希望找到一种更经验的方法。
当然,我可以将一个显式的version元素添加到该依赖项中,或为该依赖项添加一个显式的依赖项管理元素。但是我的问题本质上是学术性的,我想了解为什么maven认为这是要解决的正确版本。
理想情况下,我想学习的是存在哪些工具或流程来“调试”此工具,例如一个特定的Maven插件,可能有助于显示如何解决版本。
以下结果:mvn dependency:tree | grep -i dynamo | wc -l
为1
。我认为,这表明它在传递依赖项中没有多次出现。
答案 0 :(得分:1)
Maven使用“最近获胜”启发式方法来解决依赖关系(read more about Dependency Mechanism)。
在这里,您可能有两个依赖项,具体取决于同一个工件com.amazonaws:aws-java-sdk-dynamodb
,但版本不同(1.11.125
和另一个版本)。
当发生冲突时(请参阅我上面提供的指南中的“依赖关系调解”),Maven通过从项目根目录中选择“最近”版本来解决冲突。下面是一个示例:
+----------------+
| |
| your project |
| |
+----+------+----+
| |
+-----+ +-----+
| |
+-------v------+ +------v-------+
| dependency A | | dependency B |
+-------+------+ +------+-------+
| |
| |
+-----------v---------+ |
| com.amazonaws | +------v-------+
|aws-java-sdk-dynamodb| | dependency C |
| 1.11.125 | +------+-------+
+---------------------+ |
|
+---------v-----------+
| com.amazonaws |
|aws-java-sdk-dynamodb|
| 1.11.838 |
+---------------------+
假设您的项目依赖于依赖项A和B,并且这些依赖关系可传递地依赖于aws-java-sdk-dynamodb
(1.11.125
和
1.11.838
)。由于版本1.11.125
从根开始“更近”,因此将选择此版本。这可能就是您的情况。
如果您需要在自己的代码中使用此依赖项,建议您显式设置工件的版本,而不要依赖Maven的选择。
自Maven 2.0.9起,如果存在冲突且没有“最近”工件(在上一示例中,如果B
直接依赖于1.11.838
版本),则选择的版本取决于是否A
在B
中pom.xml
之前或之后声明。如果首先声明A
,则将选择版本1.11.125
。
答案 1 :(得分:1)
谜语解决了,我正在使用BOM表spring-cloud-dependencies:Edgware.SR4
,该BOM表内部使用spring-cloud-dependencies-parent:Edgware.SR4
,然后使用spring-cloud-aws-dependencies:1.2.3.RELEASE
,最终引用了aws-java-sdk-bom:1.11.125
,如图here所示。 >