Spring Boot useTestClasspath抛出CannotLoadBeanClassException和ClassNotFoundException

Raf*_*afa 5 maven-plugin spring-boot

我有一个带有测试类的Maven项目,该类src/test/java/MyDevClass仅用于开发/测试目的。我想在命令行启动spring-boot-maven-plugin时使用它mvn spring-boot:run

因此,我pom.xml包含:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <!-- TODO: Will create a maven profile and have useTestClasspath only for development/testing -->
                <useTestClasspath>true</useTestClasspath>
            </configuration>
        </plugin>
    </plugins>
</build>
Run Code Online (Sandbox Code Playgroud)

但是,出现以下错误:

org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [MyDevClass]
Caused by: java.lang.ClassNotFoundException: MyDevClass
Run Code Online (Sandbox Code Playgroud)

足够有趣的是,我还有另一个使用tomcat7-maven-plugin的项目,并且工作正常:

        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.0</version>
            <configuration>
                <useTestClasspath>true</useTestClasspath>
            </configuration>
        </plugin>
Run Code Online (Sandbox Code Playgroud)

我缺少什么?

leo*_*nid 4

Spring-boot maven 插件不会将当前模块的测试源(和资源)包含到类路径中,即使useTestClasspath即使设置为 true,

我使用详细日志记录运行了分叉执行(-X,并且该插件列出了分叉 JVM 类路径。测试班不包括在内。

如果您查看插件源代码(撰写本文时版本为 1.5.3),您useTestClasspath会发现该标志仅在方法中使用addDependencies

我认为有两种解决方法

  1. target/test-classes目录添加到运行类路径:

    <directories>
      <directory>${project.build.testOutputDirectory}</directory>
    </directories>
    
    Run Code Online (Sandbox Code Playgroud)

    对于较旧的插件版本使用:

    <folders>
      <folder>${project.build.testOutputDirectory}</folder>
    </folders>
    
    Run Code Online (Sandbox Code Playgroud)

    这里的问题是该文件夹被添加到类路径的开头,而测试文件最好在其末尾。

  2. 使用测试类和资源创建另一个 Maven 模块,并将其添加为<scope>test</scope>依赖项。