Java Maven验证Spring启动应用程序类的ClassNotFoundException
当我尝试为Java Spring启动项目运行Maven的verify lifecycle时,我得到了一个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
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>