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 初始化程序生成)无法执行 ma​​ven-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 中所说,这种解决方法并非没有问题。 这个修复对我有用,但是,我收到一个警告,应该提供/指示一个版本。为避免将来出现错误,我建议添加一个。截至目前,2.22.1 似乎是最新的。 一个应该设置版本不要在构建时获得 Maven 警告。编辑:正如之前的评论中所说的那样【参考方案2】:

jediz 提供的&lt;useSystemClassLoader&gt;false&lt;/useSystemClassLoader&gt; 解决方案确实允许我的万无一失的测试运行,但在我的一些 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.xmlsettings.xml 中的不同更改)不起作用。

尽管它没有包含确切的解决方案,但this answer 也非常有助于我说清楚,这是 Ubuntu JDK 和 Maven Surefire 插件中两个独立的、单独的无害错误的不幸合作.

具有相同 JDK 和 Maven 版本的最新 Debian (buster) 似乎没有受到问题的影响,但 Ubuntu (xenial) 受到了影响。

确切的解决方案来自this的答案。

未来的更新:使用 Debian Buster 一切正常,不再需要这种解决方法。

【讨论】:

【参考方案5】:

将 maven-surefire-plugin 添加到我的 POM 顶部(在 &lt;project&gt; 节点内)后,我能够从我的 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 运行

无法使用 SSL 运行 Spring Boot 应用程序

无法运行 Spring Boot 应用程序,出现 OptimisticLockException

无法运行 Spring Boot 应用程序?

无法使用 Maven 运行单个测试方法

无法使Spring Boot + JavaFX在Eclipise中运行