Java Maven验证Spring启动应用程序类的ClassNotFoundException

Java Maven验证Spring启动应用程序类的ClassNotFoundException,java,spring-boot,maven,Java,Spring Boot,Maven,当我尝试为Java Spring启动项目运行Maven的verify lifecycle时,我得到了一个NoClassDefFoundError。它使用mvn spring boot:run编译得很好,但是当我运行mvn clean verify时,它失败了,因此: $mvn clean verify -Dsurefire.skip=true -X ... Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.209

当我尝试为Java Spring启动项目运行Maven的verify lifecycle时,我得到了一个
NoClassDefFoundError
。它使用
mvn spring boot:run
编译得很好,但是当我运行
mvn clean verify
时,它失败了,因此:

$mvn clean verify -Dsurefire.skip=true -X
...
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.209 sec <<< FAILURE! - in com.fitforger.FitForgerBackendApplicationTests
    initializationError(com.fitforger.FitForgerBackendApplicationTests)  Time elapsed: 0.005 sec  <<< ERROR!
    java.lang.NoClassDefFoundError: com/fitforger/model/GymRat
    Caused by: java.lang.ClassNotFoundException: com.fitforger.model.GymRat
my pom.xml的相关部分:

<build>
    <resources>
        <resource>
            <directory>resources</directory>
            <targetPath>${project.build.outputDirectory}</targetPath>
            <includes>
                <include>application.properties</include>
            </includes>
        </resource>
    </resources>

    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.6.1</version>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.19.1</version>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>1.5.1.RELEASE</version>
        </plugin>
    </plugins>

    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>1.5.1.RELEASE</version>
                <executions>
                    <execution>
                        <id>pre-integration-test</id>
                        <goals>
                            <goal>start</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>post-integration-test</id>
                        <goals>
                            <goal>stop</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.19.1</version>
                <configuration>
                    <excludes>
                        <exclude>com.fitforger.FitForgerBackendApplicationTests</exclude>
                    </excludes>
                    <skip>${surefire.skip}</skip>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.19.1</version>
                <configuration>
                    <includes>
                        <include>com.fitforger.FitForgerBackendApplicationTests</include>
                    </includes>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>integration-test</goal>
                            <goal>verify</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </pluginManagement>
</build

资源
${project.build.outputDirectory}
应用程序属性
org.apache.maven.plugins
maven编译器插件
3.6.1
org.apache.maven.plugins
maven故障保护插件
2.19.1
org.apache.maven.plugins
maven surefire插件
org.springframework.boot
springbootmaven插件
1.5.1.1发布
org.springframework.boot
springbootmaven插件
1.5.1.1发布
预集成测试
开始
整合后测试
停止
org.apache.maven.plugins
maven编译器插件
UTF-8
${java.version}
${java.version}
org.apache.maven.plugins
maven surefire插件
2.19.1
com.fitforger.FitForgerBackendApplicationTests
${surefire.skip}
org.apache.maven.plugins
maven故障保护插件
2.19.1
com.fitforger.FitForgerBackendApplicationTests
集成测试
验证

通过执行以下操作解决OP问题

看起来与您面临的情况相似。你能试一下吗

<plugin>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-maven-plugin</artifactId>
   <configuration>
        <classifier>exec</classifier>
   </configuration>
 </plugin>

org.springframework.boot
springbootmaven插件
执行官

此问题还可能表现为集成测试用例无法找到您的
应用程序.properties
资源

这是由
springbootmaven插件
完成的springbootmaven重新打包与
maven故障保护插件
用于设置集成测试类路径的逻辑的交互

故障保护插件将打包的JAR放在类路径上,而不是保存未打包类和资源的目录(如
project.build.outputDirectory
属性所示,该属性通常是
${basedir}/target/classes
)。然而,
springbootmaven plugin
所做的重新打包将应用程序的类和资源放在JAR中一个不寻常的位置,因此尽管Failsafe检查了JAR,但它没有找到它要找的东西

通过在配置中使用
additionalClasspathElements
,显式告诉故障保护插件使用类路径将保存解包类和资源的目录放在上面,可以解决这个问题:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <configuration>
            <additionalClasspathElements>
                <additionalClasspathElement>${basedir}/target/classes</additionalClasspathElement>
            </additionalClasspathElements>
            <includes>
                <include>**/*IT.java</include>
            </includes>
        </configuration>
        <executions>
            <execution>
                <goals>
                    <goal>integration-test</goal>
                    <goal>verify</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

org.apache.maven.plugins
maven故障保护插件
${basedir}/target/classes
**/*IT.java
集成测试
验证

如果您没有扩展
spring boot starter父级
,则必须在故障保护配置中添加
classesDirectory
(就像pom所做的那样):


org.apache.maven.plugins

关于类似的问题()。

This()看起来与您面临的问题类似。你能试试
org.springframework.boot-spring-boot-maven-plugin-exec
!非常感谢…可能想添加一个一般性的响应,这样我就可以将其标记为正确。很高兴它成功了。我已将其作为答复提出。
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <configuration>
            <additionalClasspathElements>
                <additionalClasspathElement>${basedir}/target/classes</additionalClasspathElement>
            </additionalClasspathElements>
            <includes>
                <include>**/*IT.java</include>
            </includes>
        </configuration>
        <executions>
            <execution>
                <goals>
                    <goal>integration-test</goal>
                    <goal>verify</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <!-- this one here! -->
        <classesDirectory>${project.build.outputDirectory}</classesDirectory>
    </configuration>
</plugin>