有没有办法告诉为什么Maven依赖在特定版本

时间:2018-08-09 17:02:17

标签: maven maven-2 maven-3

我有一个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 -l1。我认为,这表明它在传递依赖项中没有多次出现。

2 个答案:

答案 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-dynamodb1.11.1251.11.838)。由于版本1.11.125从根开始“更近”,因此将选择此版本。这可能就是您的情况。

如果您需要在自己的代码中使用此依赖项,建议您显式设置工件的版本,而不要依赖Maven的选择。

其他信息

自Maven 2.0.9起,如果存在冲突且没有“最近”工件(在上一示例中,如果B直接依赖于1.11.838版本),则选择的版本取决于是否ABpom.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所示。 >