java - Spring-boot-test 依赖项必须手动导入,尽管它们存在于 Spring-boot-starter-parent 中 - 为什么?

标签 java spring maven spring-mvc pom.xml

我正在运行一个带有 spring-boot-starter 依赖项的 spring boot 应用程序,如果我不导入以下测试依赖项,我的测试用例将面临编译错误

  • Spring 启动测试
  • Spring 测试
  • 断言核心

我的理解是这些已经存在于 spring-boot-starter-parent 中,我也可以看到它们。但是,由于编译时错误,我被迫将它们导入到 pom.xml 中,如下所示,但随后我收到警告

Duplicating managed version 1.5.6.RELEASE for spring-boot-test

Duplicating managed version 4.3.10.RELEASE for spring-test

and similiarly for assertj-core

你可以在这里看到pom.xml中出现警告的地方 enter image description here

而我的pom.xml如下

 <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
    <json.version>20160810</json.version>   
</properties>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.6.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jdt.core.compiler</groupId>
        <artifactId>ecj</artifactId>
        <version>4.6.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.hateoas</groupId>
        <artifactId>spring-hateoas</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
    <!-- <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency> -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-test</artifactId>
        <version>1.5.6.RELEASE</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>4.3.10.RELEASE</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.assertj</groupId>
        <artifactId>assertj-core</artifactId>
        <version>3.8.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>${json.version}</version>
    </dependency>

如果我不包含测试依赖项,我的代码部分会发生编译错误,如下所示。如果依赖项不存在,则无法导入 @SpringBootTest 和 TestRestTemplate。

import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import com.fasterxml.jackson.core.JsonProcessingException;

@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) 
public class MatchControllerTest {

    // Test RestTemplate to invoke the APIs.
    @Autowired
    private TestRestTemplate testRestTemplate;
    //....and other part of the code

为什么会这样?

  1. 如果测试依赖项已经存在于 spring-boot-starter-parent 中,为什么还必须手动将它们包含在 pom.xml 中
  2. 包含后,它会显示重复的托管版本警告(可能是正确的...)。

我可能在做一些愚蠢/错误的事情 - 请帮忙!

最佳答案

正如您在 pom 中所见:

<dependencyManagement>
        <dependencies>
            <!-- Spring Boot -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot</artifactId>
                <version>1.5.6.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot</artifactId>
                <type>test-jar</type>
                <version>1.5.6.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-test</artifactId>
                <version>1.5.6.RELEASE</version>
            </dependency>
 ...

依赖项在标签<dependencyManagement> 下.这意味着,如果您在项目中需要它,您将获得版本 1.5.6.RELEASE

所以你只需要添加

  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-test</artifactId>
        <scope>test</scope>
    </dependency>

没有版本号,警告应该消失。

关于java - Spring-boot-test 依赖项必须手动导入,尽管它们存在于 Spring-boot-starter-parent 中 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45627560/

相关文章:

java - 如何在编译时使用 Maven 将文件夹(及其内容)添加到 Jar 文件的根目录?

java - Maven 找不到 web.xml

java - GridBagLayout 元素不移动

java - 在 WAR 文件中定义 Servlet 上下文

java - @PostConstruct sleep 时不会触发 ContextClosedEvent

maven - 如何将编译时 Maven 定义的属性传递给 spring-boot 应用程序?

java - 访问注释中的属性值

java - 等于验证与indexOf验证?

spring - 从 Spring 的 @EventListener(condition = "...") 中的属性文件评估属性

spring - Spring 3 中的@Autowired 注释行为