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.xmlsettings.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>