Spring Boot 无法运行 maven-surefire-plugin ClassNotFoundException org.apache.maven.surefire.booter.Forke
Posted
技术标签:
【中文标题】Spring Boot 无法运行 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 【发布时间】:2018-11-12 16:06:53 【问题描述】:运行 Spring Boot 2.0.2.RELEASE 应用程序的 maven (3.5.2) 构建(由具有 Web 依赖关系的 Web 初始化程序生成)无法执行 maven-surefire-plugin 只是说:
错误:无法找到或加载主类 org.apache.maven.surefire.booter.ForkedBooter
原因:java.lang.ClassNotFoundException:org.apache.maven.surefire.booter.ForkedBooter
为什么会这样?它是引导中的问题+肯定集成=错误吗?
作为参考,看起来相关的依赖项是:
<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>
【问题讨论】:
upstream issue 显示了三个解决方法(此处列出的两个,加上forkCount
0),但没有一个没有问题☹
【参考方案1】:
解决该问题的方法是覆盖 Spring Boot 的 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>
【讨论】:
是的,我可以确认解决方案解决了问题,但幕后问题是什么? - 我们的 CI 系统上的每晚构建突然变红,没有任何代码更改。是 Spring Boot 的问题吗? @agassner 看看这个,我是通过this 帖子到达这里的 正如the other answer 和the upstream issue 中所说,这种解决方法并非没有问题。 这个修复对我有用,但是,我收到一个警告,应该提供/指示一个版本。为避免将来出现错误,我建议添加一个。截至目前,jediz 提供的<useSystemClassLoader>false</useSystemClassLoader>
解决方案确实允许我的万无一失的测试运行,但在我的一些 Spring Boot 集成测试中破坏了类加载。
以下 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>
【讨论】:
正如the upstream issue 中所说,此解决方法也并非没有问题☹ 这个简单的选项解决了我在 1.8 和 11 中出现的问题。Tks!【参考方案3】:这是由于known bug in the Maven Surefire plugin。它已在版本 3.0.0-M1 中修复,即 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>
【讨论】:
【参考方案4】:对我来说,解决方案是将 mvn 作为运行
_JAVA_OPTIONS=-Djdk.net.URLClassPath.disableClassPathURLCheck=true mvn clean compile package
其他想法(将系统属性赋予 maven 参数列表,pom.xml
、settings.xml
中的不同更改)不起作用。
尽管它没有包含确切的解决方案,但this answer 也非常有助于我说清楚,这是 Ubuntu JDK 和 Maven Surefire 插件中两个独立的、单独的无害错误的不幸合作.
具有相同 JDK 和 Maven 版本的最新 Debian (buster) 似乎没有受到问题的影响,但 Ubuntu (xenial) 受到了影响。
确切的解决方案来自this的答案。
未来的更新:使用 Debian Buster 一切正常,不再需要这种解决方法。
【讨论】:
【参考方案5】:将 maven-surefire-plugin 添加到我的 POM 顶部(在 <project>
节点内)后,我能够从我的 POM 中删除 maven-surefire-plugin
<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,到目前为止似乎已经解决了这个问题。
以后您不必单独管理各个插件版本。只是控制超级 pom 版本的最小 maven 版本。
【讨论】:
我尝试了这个解决方案,结果如下:[WARNING] The project com.example:pom:0.0.2 uses prerequisites which is only intended for maven-plugin projects but not for non maven-plugin projects. For such purposes you should use the maven-enforcer-plugin. See https://maven.apache.org/enforcer/enforcer-rules/requireMavenVersion.html
我使用 maven 3.6.0、OpenJDK11 和 Spring boot 2.1.X 父版本对其进行了测试。我设法通过使用上面的rvange 的answer 解决了这个问题。
很抱歉我的回答对您不起作用,但很高兴您找到了一个适合您的答案!不过,在几个项目中,我的回答对我来说仍然很有效,所以我将把它留在那里。【参考方案6】:
将此添加到 maven-surefire-plugin 我解决了问题:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<forkCount>0</forkCount>
</configuration>
</plugin>
【讨论】:
欢迎来到 SO!回答时,请做的不仅仅是扔掉代码。相反,解释为什么代码应该是选定的解决方案。目标是教育、教 OP 如何钓鱼,而不仅仅是用一条鱼解决当前的问题。 我只看到在较新版本的 Java(如 11)下运行较旧版本的插件时需要这样做。请尝试使用最新版本的插件。以上是关于Spring Boot 无法运行 maven-surefire-plugin ClassNotFoundException org.apache.maven.surefire.booter.Forke的主要内容,如果未能解决你的问题,请参考以下文章
Intellij spring boot 应用程序无法从 tomcat 运行