Spring 启动失败 运行 maven-surefire-plugin ClassNotFoundException org.apache.maven.surefire.booter.ForkedBooter
Spring Boot fails to run maven-surefire-plugin ClassNotFoundException org.apache.maven.surefire.booter.ForkedBooter
运行 Spring Boot 2.0.2.RELEASE 应用程序的
运行 maven (3.5.2) 构建(由网络初始化程序生成依赖项)无法执行 maven-surefire-plugin 说:
Error: Could not find or load main class
org.apache.maven.surefire.booter.ForkedBooter
Caused by: java.lang.ClassNotFoundException: org.apache.maven.surefire.booter.ForkedBooter
为什么会这样?是引导问题 + surefire 集成 = 错误吗?
作为参考,似乎相关的依赖项是:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath/>
</parent>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
...
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
该问题的解决方法是覆盖 Spring 引导的 maven-surefire-plugin
定义并将 useSystemClassLoader
设置为 false
。阅读 Surefire docs 了解更多详情
<build>
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
</plugin>
</plugins>
</build>
jediz 提供的 <useSystemClassLoader>false</useSystemClassLoader>
解决方案确实允许我的 surefire 测试 运行,但在我的一些 Spring 引导集成测试中破坏了 class 加载。
以下 maven-surefire-plugin 配置对我有用:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>-Djdk.net.URLClassPath.disableClassPathURLCheck=true</argLine>
</configuration>
</plugin>
这是由于 known bug in the Maven Surefire plugin. It was fixed in version 3.0.0-M1, which was released in November 2018。所以最简单和最可靠的修复是升级你使用的插件版本。
将 maven-surefire-plugin 从 2.12.4 更新到 3.0.0-M1 对我有用。项目没有明确使用插件,只好自己添加一个新的插件依赖
<plugins>
...
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M1</version>
</plugin>
...
</plugins>
对我来说,解决方案是 运行 mvn as
_JAVA_OPTIONS=-Djdk.net.URLClassPath.disableClassPathURLCheck=true mvn clean compile package
其他想法(将系统 属性 提供给 maven 参数列表,pom.xml
、settings.xml
中的不同更改)无效。
尽管它没有包含确切的解决方案,但 对我来说非常有帮助,它是 [=31] 中两个独立的、单独无害的错误的不幸合作=] JDK 和 Maven Surefire 插件。
具有相同 JDK 和 Maven 版本的最新 Debian (buster) 似乎没有受到该问题的影响,但 Ubuntu (xenial) 受到了影响。
确切的解决方案来自 答案。
未来更新:使用 Debian Buster 一切正常,不再需要此解决方法。
在将 maven-surefire-plugin 添加到我的 POM 顶部(在 <project>
节点内)后,我能够从我的 POM 中删除它
<prerequisites>
<maven>3.6.3</maven>
</prerequisites>
为什么我认为这是正确答案?
- 指定Maven推荐使用的Maven版本:https://maven.apache.org/download.cgi
- 当你 运行
mvn versions:display-plugin-updates
它表明它正在从 super-pom 中获取 maven-surefire-plugin 3.0.0-M3,到目前为止似乎已经解决了这个问题。
- 您以后不必单独管理各个插件版本。只是控制 super-pom 版本的最低 maven 版本。
将此添加到 maven-surefire-plugin 我解决了问题:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<forkCount>0</forkCount>
</configuration>
</plugin>
运行 Spring Boot 2.0.2.RELEASE 应用程序的
运行 maven (3.5.2) 构建(由网络初始化程序生成依赖项)无法执行 maven-surefire-plugin 说:
Error: Could not find or load main class org.apache.maven.surefire.booter.ForkedBooter
Caused by: java.lang.ClassNotFoundException: org.apache.maven.surefire.booter.ForkedBooter
为什么会这样?是引导问题 + surefire 集成 = 错误吗?
作为参考,似乎相关的依赖项是:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath/>
</parent>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
...
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
该问题的解决方法是覆盖 Spring 引导的 maven-surefire-plugin
定义并将 useSystemClassLoader
设置为 false
。阅读 Surefire docs 了解更多详情
<build>
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
</plugin>
</plugins>
</build>
jediz 提供的 <useSystemClassLoader>false</useSystemClassLoader>
解决方案确实允许我的 surefire 测试 运行,但在我的一些 Spring 引导集成测试中破坏了 class 加载。
以下 maven-surefire-plugin 配置对我有用:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>-Djdk.net.URLClassPath.disableClassPathURLCheck=true</argLine>
</configuration>
</plugin>
这是由于 known bug in the Maven Surefire plugin. It was fixed in version 3.0.0-M1, which was released in November 2018。所以最简单和最可靠的修复是升级你使用的插件版本。
将 maven-surefire-plugin 从 2.12.4 更新到 3.0.0-M1 对我有用。项目没有明确使用插件,只好自己添加一个新的插件依赖
<plugins>
...
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M1</version>
</plugin>
...
</plugins>
对我来说,解决方案是 运行 mvn as
_JAVA_OPTIONS=-Djdk.net.URLClassPath.disableClassPathURLCheck=true mvn clean compile package
其他想法(将系统 属性 提供给 maven 参数列表,pom.xml
、settings.xml
中的不同更改)无效。
尽管它没有包含确切的解决方案,但
具有相同 JDK 和 Maven 版本的最新 Debian (buster) 似乎没有受到该问题的影响,但 Ubuntu (xenial) 受到了影响。
确切的解决方案来自
未来更新:使用 Debian Buster 一切正常,不再需要此解决方法。
在将 maven-surefire-plugin 添加到我的 POM 顶部(在 <project>
节点内)后,我能够从我的 POM 中删除它
<prerequisites>
<maven>3.6.3</maven>
</prerequisites>
为什么我认为这是正确答案?
- 指定Maven推荐使用的Maven版本:https://maven.apache.org/download.cgi
- 当你 运行
mvn versions:display-plugin-updates
它表明它正在从 super-pom 中获取 maven-surefire-plugin 3.0.0-M3,到目前为止似乎已经解决了这个问题。 - 您以后不必单独管理各个插件版本。只是控制 super-pom 版本的最低 maven 版本。
将此添加到 maven-surefire-plugin 我解决了问题:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<forkCount>0</forkCount>
</configuration>
</plugin>