作为项目的一部分,我构建了一个Spring Boot启动程序。
当我检查启动器中使用的依赖项时,没有任何冲突。 Pom.xml可用here。例如,在启动器1.1.0中确实得到了dataList
2.9.8
现在,当我在另一个项目中使用启动器时,唯一声明的依赖项在启动器之上:
jackson-databind
(可用示例here)
我希望看到完全相同的依赖关系。嗯,我没有。 在这种情况下,jackson-databind 2.8.9是“获胜”,而不是2.9.8
这在运行时引起问题。这很烦人,因为如果我不能保证使用时会出现哪些依赖关系,我就不能真正轻松地分发启动程序。
哪个Maven规则在起作用?我不明白。而且我如何确保发行的入门版中包含正确的版本,所以我不需要告诉人们使用它们时明确声明版本吗?
答案 0 :(得分:1)
在您的POM或父POM中可能有<dependencyManagement>
正在进行。这会将版本设置为2.9.8。
在另一种情况下,Maven遵循“最小依赖赢得”策略,这会导致意外行为。
答案 1 :(得分:0)
好的,我不知道这是否是推荐的操作方式,但这是可行的。在使用启动程序的自定义项目中,将父pom用作BOM,将启动程序用作依赖项,每次都提及版本:
<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。