[英]Spring Boot Maven Integration Test Giving ClassNotFoundException
[英]Maven verify ClassNotFoundException for class of Spring Boot application
当我尝试为我的 Java Spring Boot 项目运行 Maven 的验证生命周期时,我收到了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
其中com.fitforger.model.GymRat
是我的应用程序的类之一。
项目结构:
+----src
+----main
| +----java
| | +----com
| | +----fitforger
| | +----controller
| | | +----GymRatController.java
| | | +----WorkoutNodeController.java
| | +----dao
| | | +----GymRatDAO.java
| | +----exception
| | | +----GymRatCreationFailure.java
| | | +----GymRatExistsException.java
| | | +----GymRatNotFound.java
| | | +----GymRatUpdateFailure.java
| | +----FitForgerBackendApplication.java
| | +----model
| | | +----FitForgerModel.java
| | | +----GymRat.java
| | | +----WorkoutAttribute.java
| | | +----WorkoutNode.java
| | | +----WorkoutNodeTypes.java
| | +----repository
| | +----CouchbaseRepository.java
| | +----FitForgerRepository.java
| +----resources
| +----application.properties
+----test
+----java
| +----com
| +----fitforger
| +----FitForgerBackendApplicationTests.java
| +----GymRatSteps.java
| +----repository
| +----CouchbaseRepositoryTest.java
+----resources
+----com
+----fitforger
+----GymRat.feature
我的 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
通过执行以下操作解决了 OP 问题,
这看起来与您所面临的相似。 你能试试吗
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
此问题还可能表现为集成测试用例未能找到您的application.properties
资源。
发生这种情况是因为spring-boot-maven-plugin
完成的 Spring Boot 重新打包的交互,以及maven-failsafe-plugin
用于设置集成测试类路径的逻辑。
Failsafe 插件将打包的 JAR 放在类路径上,而不是存放解压类和资源的目录(由project.build.outputDirectory
属性给出,通常是${basedir}/target/classes
)。 然而,由spring-boot-maven-plugin
完成的重新打包将应用程序的类和资源放置在 JAR 中一个不寻常的位置,因此尽管 Failsafe 检查了 JAR,但它没有找到它正在寻找的东西。
您可以通过在其配置中使用additionalClasspathElements
显式告诉 Failsafe 插件将包含解压类和资源的目录放在使用类路径上来解决此问题:
<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>
如果你没有扩展spring-boot-starter-parent
,你必须在你的故障安全配置中添加classesDirectory
(就像spring-boot-starter-parent pom 一样):
<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>
在关于类似问题的JIRA 评论中发现( failsafe 2.19+ not working with spring boot 1.4 )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.