Maven-使用jar作为依赖项时获得不同的版本->令人困惑

时间:2019-03-15 04:56:43

标签: maven spring-boot

作为项目的一部分,我构建了一个Spring Boot启动程序。

当我检查启动器中使用的依赖项时,没有任何冲突。 Pom.xml可用here。例如,在启动器1.1.0中确实得到了dataList 2.9.8

proper dependencies

现在,当我在另一个项目中使用启动器时,唯一声明的依赖项在启动器之上:

jackson-databind

(可用示例here

我希望看到完全相同的依赖关系。嗯,我没有。 在这种情况下,jackson-databind 2.8.9是“获胜”,而不是2.9.8

enter image description here

这在运行时引起问题。这很烦人,因为如果我不能保证使用时会出现哪些依赖关系,我就不能真正轻松地分发启动程序。

哪个Maven规则在起作用?我不明白。而且我如何确保发行的入门版中包含正确的版本,所以我不需要告诉人们使用它们时明确声明版本吗?

2 个答案:

答案 0 :(得分:1)

在您的POM或父POM中可能有<dependencyManagement>正在进行。这会将版本设置为2.9.8。

在另一种情况下,Maven遵循“最小依赖赢得”策略,这会导致意外行为。

答案 1 :(得分:0)

好的,我不知道这是否是推荐的操作方式,但这是可行的。在使用启动程序的自定义项目中,将父pom用作BOM,将启动程序用作依赖项,每次都提及版本:

https://github.com/vincent-fuchs/custom-ci-droid-tasks-consumer/blob/2d9f0aff57685be38f7e8c269701dc3c2dac6ef0/pom.xml#L13-L40

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <ci-droid-tasks-consumer.version>1.1.0</ci-droid-tasks-consumer.version>
</properties>

<dependencyManagement>
    <dependencies>
    <dependency>
        <groupId>com.societegenerale.ci-droid.tasks-consumer</groupId>
        <artifactId>ci-droid-tasks-consumer-parent</artifactId>
        <type>pom</type>
        <scope>import</scope>
        <version>${ci-droid-tasks-consumer.version}</version>
    </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>

    <dependency>
        <groupId>com.societegenerale.ci-droid.tasks-consumer</groupId>
        <artifactId>ci-droid-tasks-consumer-starter</artifactId>
        <version>${ci-droid-tasks-consumer.version}</version>
    </dependency>

</dependencies>

如果我这样导入,则jackson-databinder会出现在主项目中,即2.9.8。