为什么测试范围依赖关系会在 Maven 中拉取编译范围依赖关系?

Why do test scope dependencies pull compile scope dependencies in Maven?

提问人:Bryan Tan 提问时间:2/18/2022 更新时间:2/19/2022 访问量:673

问:

目前我的项目使用 spring boot starter 测试,如下所示:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <version>2.3.8.RELEASE</version>
    <scope>test</scope>
</dependency>

但是,尽管有测试范围,但它将spring-core(在此版本中是易受攻击的tpl)作为编译范围传递依赖项,并且它出现在我编译的二进制文件中。

我知道我可以通过在测试范围内显式拉取spring-core来解决这个问题:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.2.12.RELEASE</version>
    <scope>test</scope>
</dependency>

但是,这不应该是必需的。为什么仅在测试中可用的依赖项将依赖项拉入编译范围?

Spring Maven 管理 依赖解析

评论

1赞 J Fabian Meier 2/18/2022
测试依赖项无法拉取编译范围依赖项。有问题的依赖关系可能来自其他地方。检查 .也可能是 dependencyManagement 条目覆盖范围的情况。mvn dependency:tree

答:

0赞 Bryan Tan 2/19/2022 #1

在 J Fabian Meyer 发表评论后,我仔细检查了一遍。当 spring core 出现在依赖树中的 spring-boot-starter-test 下时,它被 spring-boot-starter-web 拉入编译范围。

我的猜测是spring-boot-starter-test拉取了spring-core的更高版本,这就是为什么它出现在树中的原因