Gradle 5 JUnit BOM和Spring Boot不正确的版本

时间:2019-02-08 18:44:05

标签: spring-boot gradle junit junit5

我正在使用Gradle 5的BOM(物料清单)feature。这就是我对JUnit 5依赖项的描述方式:

testImplementation(enforcedPlatform("org.junit:junit-bom:5.4.0")) // JUnit 5 BOM
testImplementation("org.junit.jupiter:junit-jupiter-api")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine")
testImplementation("org.junit.jupiter:junit-jupiter-params")

我的假设是,提供BOM会将依赖项的版本解析为5.4.0。但是,他们决定解决5.1.1。我不知道为什么。 (我还请求enforcedPlatform()锁定指定的版本)

enter image description here

检查JUnit 5's BOM时,我们看到所有org.junit.jupiter依赖项都列出了版本5.4.0(在项目中解析为5.1.1),而所有org.junit.platform依赖项都列出了版本1.4.0可以在项目中正确解析。

我不确定我缺少什么,希望在这里得到一些帮助。谢谢!

编辑:

我使用了Sormuras响应并将所有BOM都移到了dependencies {}块的顶部,但是仍然没有获得版本5.4.0。然后我怀疑它可能来自我使用的Gradle Spring Dependency Management插件,所以当我注释掉它时,我得到了JUnit 5.4.0版本。如何禁用来自Gradle Spring Dependency Management插件的JUnit?

Gradle Spring Dependency Management plugin

最后一次:

我决定直接使用Spring Boot Dependencies BOM并删除Gradle插件:

implementation(platform("org.springframework.boot:spring-boot-dependencies:2.0.5.RELEASE"))

我想象该插件是为Gradle 5之前的那些版本的Gradle创建的,在该版本中您无法使用BOM表文件。现在有了BOM支持,我可以直接包括它。这样,我的JUnit版本就是我在enforcedPlatform()块中指定的版本。

我接受了萨姆·布兰嫩(Sam Brannen)的以下回答,因为他很好地解释了问题的发生方式和解决方法,并且我认为这与使用较旧版本的Gradle的用户有关。

3 个答案:

答案 0 :(得分:15)

  

如何禁用来自Gradle Spring Dependency Management插件的JUnit?

对于初学者来说,如果您使用的是Spring的依赖性管理插件,则不应导入junit-bom,因为这会导致对这些依赖性的重复管理(并且可能会产生冲突)。

除此之外,每当您使用Spring的依赖性管理插件并要覆盖托管版本时,都必须通过覆盖插件所使用的BOM中定义的版本的确切名称来做到这一点。

这在Spring Boot for Gradlefor Maven中有记录。

对于Spring Boot,JUnit Jupiter版本的名称为“ junit-jupiter.version”。您可以找到Spring Boot 2.1.2 here的所有托管版本的名称。

因此,在Gradle中,您可以按以下方式覆盖它。

ext['junit-jupiter.version'] = '5.4.0'

您可以看到我确实在这里做了:https://github.com/sbrannen/spring-events/blob/master/build.gradle#L38

使用Maven时,您可以按如下所示进行覆盖。

<properties>
    <junit-jupiter.version>5.4.0</junit-jupiter.version>
</properties>

此处的其他背景信息:https://docs.spring.io/platform/docs/current/reference/html/getting-started-overriding-versions.html

答案 1 :(得分:1)

JUnit 5.4.0简化了其工件,现在为Jupiter提供了一个工件-org.junit:junit-jupiter。也就是说,您也应该简化Gradle文件:

testImplementation(enforcedPlatform("org.junit:junit-bom:5.4.0")) // JUnit 5 BOM
testImplementation("org.junit.jupiter:junit-jupiter")

答案 2 :(得分:1)

确保在其他也引用JUnit的BOM之前,先包含JUnit的BOM。第一个BOM获胜并锁定了所有后续工件的版本。

有关使用Maven和Spring Boot进行类似设置的问题,请参见此问题:https://github.com/sormuras/junit-platform-maven-plugin/issues/29#issuecomment-456958188