【问题标题】:Maven surefire could not find ForkedBooter classMaven surefire 找不到 ForkedBooter 类
【发布时间】:2019-03-31 07:13:48
【问题描述】:

最近来到一个新项目,我正在尝试编译我们的源代码。昨天一切正常,但今天是另一回事。

每次我在模块上运行 mvn clean install 时,一旦到达测试,它就会崩溃并报错:

[INFO] --- maven-surefire-plugin:2.18.1:test (default-test) @ recorder ---
[INFO] Surefire report directory: /lhome/code/recorder/target/surefire-reports
[INFO] Using configured provider org.apache.maven.surefire.junitcore.JUnitCoreProvider
[INFO] parallel='none', perCoreThreadCount=true, threadCount=0, useUnlimitedThreads=false, threadCountSuites=0,     threadCountClasses=0, threadCountMethods=0, parallelOptimized=true

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Error: Could not find or load main class org.apache.maven.surefire.booter.ForkedBooter

Results :

Tests run: 0, Failures: 0, Errors: 0, Skipped: 0

及以后:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.18.1:test (default-test) on project recorder: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.18.1:test failed: The forked VM terminated without properly saying goodbye. VM crash or System.exit called?

我正在使用 OpenJDK 1.8.0_181、Maven 3.5.4 在 Debian 9 (Stretch) 64 位上运行,在我在 ~/.m2/settings.xml 中配置的公司代理后面工作。

如果我没记错的话,最新的 Surefire 版本是 2.22.1 很奇怪。我试图指定插件版本,但它没有得到更新,否则任何POM(父、祖父或这个)中都没有插件版本规范。

我设法迫使 Maven 将 Surefire 版本更改为最新版本,但现在情况更糟:

[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0

[...]

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.1:test (default-test) on project recorder:     There are test failures.
[ERROR]
[ERROR] Please refer to /lhome/code/recorder/target/surefire-reports for the individual test results.
[ERROR] Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
[ERROR] The forked VM terminated without properly saying goodbye. VM crash or System.exit called?
[ERROR] Command was /bin/sh -c cd /lhome/code/recorder/ && /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java     '-javaagent:/lhome1/johndoe/.m2/repository/org/jacoco/org.jacoco.agent/0.7.4.201502262128/org.jacoco.agent-0.7.4.201502262128-runt    ime.jar=destfile=/lhome/code/recorder/target/jacoco.exec,append=true,includes=esa/*,excludes=**/api/**/*.class' -jar     /lhome/code/recorder/target/surefire/surefirebooter7426165516226884923.jar /lhome/code/recorder/target/surefire     2018-10-26T16-16-12_829-jvmRun1 surefire1721866559613511529tmp surefire_023400764142672144tmp
[ERROR] Error occurred in starting fork, check output in log
[ERROR] Process Exit Code: 1
[ERROR] org.apache.maven.surefire.booter.SurefireBooterForkException: The forked VM terminated without properly saying goodbye.     VM crash or System.exit called?
[ERROR] Command was /bin/sh -c cd /lhome/code/recorder/ && /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java     '-javaagent:/lhome1/johndoe/.m2/repository/org/jacoco/org.jacoco.agent/0.7.4.201502262128/org.jacoco.agent-0.7.4.201502262128-runt    ime.jar=destfile=/lhome/code/recorder/target/jacoco.exec,append=true,includes=esa/*,excludes=**/api/**/*.class' -jar     /lhome/code/recorder/target/surefire/surefirebooter7426165516226884923.jar /lhome/code/recorder/target/surefire     2018-10-26T16-16-12_829-jvmRun1 surefire1721866559613511529tmp surefire_023400764142672144tmp
[ERROR] Error occurred in starting fork, check output in log
[ERROR] Process Exit Code: 1
[ERROR]     at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:669)
[ERROR]     at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:282)
[ERROR]     at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:245)
[ERROR]     at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:1183)
[ERROR]     at     org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:1011)
[ERROR]     at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:857)
[ERROR]     at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
[ERROR]     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
[ERROR]     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
[ERROR]     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
[ERROR]     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
[ERROR]     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
[ERROR]     at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
[ERROR]     at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
[ERROR]     at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
[ERROR]     at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
[ERROR]     at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
[ERROR]     at org.apache.maven.cli.MavenCli.execute(MavenCli.java:954)
[ERROR]     at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
[ERROR]     at org.apache.maven.cli.MavenCli.main(MavenCli.java:192)
[ERROR]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[ERROR]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[ERROR]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[ERROR]     at java.lang.reflect.Method.invoke(Method.java:498)
[ERROR]     at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
[ERROR]     at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
[ERROR]     at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
[ERROR]     at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)

【问题讨论】:

  • 我在 clircle-ci 中遇到了这个错误。 Surefire fork and forked vm 打印以下消息并退出:“错误:无法找到或加载主类 org.apache.maven.surefire.booter.ForkedBooter”。按摩在 target/surefire-reports/*.dumpstream 中。如果您使用 -X 运行 maven,它会打印命令行,您可以尝试一下并查看 vm 打印此消息。
  • 我的解决方案是停止使用任何版本的 open-jdks。在如此基础的东西中承受不起这种不可靠性。
  • 使用maven的dependencyManagement部分指定不同版本的插件
  • 在 Debian 上更新到 jdk 11 对我来说是一个万无一失的解决方案!

标签: java maven maven-surefire-plugin


【解决方案1】:

要修复它(在 2018 年),请将您的 openjdk 更新到最新版本,至少 8u191-b12。 如果此问题在 2020 年再次出现,则可能是 openjdk 的默认行为是更改,然后您将需要更新 maven surefire 插件。

这是一个现已修复 bug in the openjdk-8 package(行为明显偏离上游而无需;缺少上游补丁以恢复禁用安全检查),您刚刚升级到。但它也是a bug in the surefire plugin, SUREFIRE-1588, supposedly fixed in surefire 3.0.0-M1:它显然在Java 将来只允许相对路径名的地方使用绝对路径(并且Debian 已经激活了未来的行为)。

软件包版本 8u181-b13-2 指出:

  • 应用来自 8u191-b12 安全更新的补丁。

请注意 191-b12 != 181-b13。 191-b12 安全补丁几天前刚刚发布,显然维护人员希望尽快将它们发送给您。完全更新到 191-b12 可能需要额外的测试(好吧,显然应该有这个上传)。

有几个解决方法:

  1. 您可以改为安装previous package from snapshots.d.o。降级后,您可以使用sudo aptitude forbid-version openjdk-8-jre-headless 禁止损坏的版本(如果您使用的是 aptitude 而不是apt)。对于常规的“apt”,我没有看到类似的禁止机制,因此您可能需要使用 apt pinning 来防止重新安装此升级(或者您只是继续再次降级,我希望这将很快得到解决)。
  2. 根据错误跟踪,使用任何常用方法(例如,JAVA_FLAGS)设置属性 -Djdk.net.URLClassPath.disableClassPathURLCheck=true 也应该会有所帮助。但我自己并没有验证这一点。您显然甚至可以add the workaround to ~/.m2/settings.xml 轻松为您的所有 Maven 构建启用它。

如您所见,错误跟踪工作,问题已缩小,修复包可用,并且新版本的 surefire 插件即将推出!

【讨论】:

  • @AdrianMadaras 到目前为止我没有得到新的更新,只有 -2 版本。也没有关于固定上传的公告,但它正在进行中。您可能刚刚重新升级到已知有问题的版本。
  • 我刚刚在使用 OpenJDK 10.0.2 的 Ubuntu 18.04 上遇到了同样的问题。将 JAVA_HOME 切换到我的“java-9-oracle”安装修复了它。
  • 这是 surefire-maven-plugin 问题跟踪器中的相应问题:issues.apache.org/jira/browse/SUREFIRE-1588(它仍然是相关 OpenJDK 更改的 Canonical/Debian 反向移植中的一个错误)。
  • 解决 1. 对我来说没有意义,因为这是我遇到问题的版本。覆盖 maven-surefire-plugin 以不使用 SystemClassLoader 也不起作用
  • 您也可以尝试升级到surefire 3.0.0-M1。但是 2 到 3 里程碑版本当然可以打破其他东西。
【解决方案2】:

将 useSystemClassloader 设置为 false:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <useSystemClassLoader>false</useSystemClassLoader>
    </configuration>
</plugin>

如果您不是从为您定义了版本的父代(例如 Spring Boot 启动器)继承,您也需要定义它。

【讨论】:

  • 启用系统类加载器是最糟糕的做法,因为您在插件进程中运行测试。正确的做法是升级每个插件的版本。 Maven 3.7.0 将升级所有属于默认生命周期的插件版本。 Spring 不应该坚持旧版本,也不应该覆盖它们。这会导致不必要的职责冲突。
  • 使用最新的 Surefire 版本 3.0.0-M5。这是由 PID 检查器引起的。现在检查器已禁用,可以手动启用和配置。
【解决方案3】:

我找到了this workaround 并修复了我的测试:将maven-surefire-plugin 配置为不使用系统类加载器。

【讨论】:

  • 根据maven-surefire-plugin维护者的说法,所有的变通方法(这个,设置forkCount为0,或者全局设置argLine)都有问题,不能通用。
  • 很好的发现。但请在您的帖子中包含实际的解决方法文本,或者至少将链接明确标识为 stackoverflow 链接。 IE。 @markoorn 使用的方法更有帮助。
  • 使用最新的 Surefire 版本 3.0.0-M5。这是由 PID 检查器引起的。现在检查器已禁用,可以手动启用和配置。
【解决方案4】:

我有另一个解决方法。设置环境变量_JAVA_OPTIONS。我已将它用于我们的 TeamCity 构建代理,现在我们的构建运行良好。

_JAVA_OPTIONS=-Djdk.net.URLClassPath.disableClassPathURLCheck=true

【讨论】:

  • 标记为安全修复的重大更改通常不会无缘无故地引入,因此有人告诉 SO 如何禁用它...只是说'
【解决方案5】:

我发布了上述解决方法之一in JIRA 的更有针对性的变体。添加到~/.m2/settings.xml:

<profile>
    <id>SUREFIRE-1588</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <argLine>-Djdk.net.URLClassPath.disableClassPathURLCheck=true</argLine>
    </properties>
</profile>

【讨论】:

  • 此操作失败并显示以下警告:[WARNING] Expected root element 'settings' but found 'profile' (position: START_TAG seen &lt;profile&gt;... @1:9) @ /home/nikolai/.m2/settings.xml, line 1, column 9
  • @Nikolai 上面的sn-p需要用&lt;settings&gt;&lt;profiles&gt;...&lt;/profiles&gt;&lt;/settings&gt;括起来。
【解决方案6】:

我在使用 maven:3.5.4-jdk-8 Docker 映像的 GitLab CI 构建中遇到了这个问题。

将其更改为 maven:3.5.4-jdk-8-alpine 解决了问题。

【讨论】:

    【解决方案7】:

    当使用带有 3.6.0-jdk-8 图像的 GitLab CI/CD 时,只有下面的属性有帮助(不修改 pom.xml)。

    -Dsurefire.useSystemClassLoader=false
    

    【讨论】:

    • 这又是一个不好的做法。对的就是升级版本。始终检查 Maven Central 中的版本。
    【解决方案8】:

    我点击此链接https://maven.apache.org/surefire/maven-surefire-plugin/examples/class-loading.html 并在 pom.xml 中添加了以下插件,它工作正常,

    <project>
      [...]
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.1</version>
            <configuration>
              <useSystemClassLoader>false</useSystemClassLoader>
            </configuration>
          </plugin>
        </plugins>
      </build>
      [...]
    </project>
    

    【讨论】:

    • 使用最新的 Surefire 版本 3.0.0-M5。这是由 PID 检查器引起的。现在检查器已禁用,可以手动启用和配置。
    【解决方案9】:

    对于那些在 GitLab CI 上搜索与 Docker Maven: 3.5.x-jdk-8 相关答案的人,请参阅this GitHub issue

    似乎3.5.4-jdk-8 图像导致升级到次要 Java 版本,这在某种程度上影响了 Surefire 的分叉机制。

    回滚到3.5.3-jdk-8 图像在我的 GitLab CI 服务器上为我修复了这个问题,使用 Surefire 2.20.1 构建 Java 1.8 代码。

    【讨论】:

      【解决方案10】:

      上面设置属性 "-Djdk.net.URLClassPath.disableClassPathURLCheck=true" 的建议对我不起作用,但设置以下确实可以:

      -DforkCount=0
      

      【讨论】:

      • 这具有不为运行测试创建新 VM 的效果,因此测试可能会影响主构建 VM。
      • 使用最新的 Surefire 版本 3.0.0-M5。这是由 PID 检查器引起的。现在检查器已禁用,可以手动启用和配置。
      【解决方案11】:

      对于 Ubuntu:安装最新版本,已修复此错误

      sudo apt-get update ; sudo apt-get dist-upgrade -y
      

      安装没有错误的最后一个工作版本(没有安全补丁)。

      sudo apt-get install openjdk-8-jdk-headless=8u181-b13-1 openjdk-8-jdk=8u181-b13-1  openjdk-8-jre=8u181-b13-1  openjdk-8-jre-headless=8u181-b13-1 openjdk-8-source=8u181-b13-1
      

      如果您错过了那个版本,请使用之前的版本:

      sudo apt-get install openjdk-8-jdk-headless=8u162-b12-1 openjdk-8-jdk=8u162-b12-1  openjdk-8-jre=8u162-b12-1  openjdk-8-jre-headless=8u162-b12-1 openjdk-8-source=8u162-b12-1
      

      然后使用pinning 或注意不要安装损坏的版本。

      无论我把那个配置放在哪里,使用-Djdk.net.URLClassPath.disableClassPathURLCheck=true 对我都不起作用。在我的集成测试中,它总是在没有旧 Java 版本的情况下退出。

      正如Erich 所提到的,这是Debian 软件包中的一个错误911925 和Surefire 插件没有按照新规则SUREFIRE-1588 行事。

      【讨论】:

      • 为什么会有人建议安装没有安全补丁的版本?!虽然其他建议包括跳过测试,呵呵。
      • 您不再需要 :-) 它已修复。但与此同时,我有许多 Java 项目需要处理,而且我的 Java 运行时没有任何地方暴露于外部的任何新代码。所以有一个可监督的风险,对我来说没问题。毕竟这是每个人自己的决定:-)
      • 其实你是对的,我发现 JDK 开发者在默认设置的那个 prop 上走回去了:hg.openjdk.java.net/jdk/jdk/rev/f54dcfc5a5f8;但实际上,将主版本升级到 surefire 似乎并不是最好的解决方法。
      • 绝对!但是他们必须做出的改变贯穿于整个代码库并且非常具有侵入性。因此,此修复程序的次要版本更改不会成为万能的选项。
      • 不幸的是,2.x 已停产,我们必须尽快进行切换:issues.apache.org/jira/browse/…
      【解决方案12】:

      我已经添加了对 junit-jupiter-engine 的依赖,并且它起作用了。

      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
          <dependencies>
              <dependency>
                  <groupId>org.junit.jupiter</groupId>
                  <artifactId>junit-jupiter-engine</artifactId>
                  <version>5.4.0</version>
              </dependency>
          </dependencies>
      </plugin>
      

      【讨论】:

      • 这个 jupiter-plugin 有什么黑魔法?这对我有用!点赞! :-)
      【解决方案13】:

      将此添加到 maven-surefire-plugin 我解决了问题:

          <plugin>    
              <groupId>org.apache.maven.plugins</groupId> 
              <artifactId>maven-surefire-plugin</artifactId>  
              <configuration>
                  <forkCount>0</forkCount>
              </configuration>
          </plugin>
      

      【讨论】:

        【解决方案14】:

        对于surefire - v2.22.2maven:3.6-jdk-8-alpine,这仍然是个问题。要解决此问题,请将以下代码添加到 pom.xml(作为 maven 插件)

        ...
        <plugin>    
            <groupId>org.apache.maven.plugins</groupId> 
            <artifactId>maven-surefire-plugin</artifactId>  
            <configuration>
                <forkCount>0</forkCount>
            </configuration>
        </plugin>
        ...
        

        【讨论】:

          【解决方案15】:

          我最近在 Jenkins 上设置了 maven 工作并陷入了同样的问题。我接受了修改 JAVA 环境变量的建议并确认问题已解决。我就是这样测试的。

          成为“jenkins”用户并将文件夹更改为您为作业设置的工作区项目名称。

           $ _JAVA_OPTIONS=-Djdk.net.URLClassPath.disableClassPathURLCheck=true mvn clean install -U
          
           $ lsb_release -rd
           Description:   Ubuntu 16.04.5 LTS
           Release:   16.04
          
           $ mvn -v
           Apache Maven 3.3.9
           Maven home: /usr/share/maven
           Java version: 1.8.0_181, vendor: Oracle Corporation
           Java home: /usr/lib/jvm/java-8-openjdk-amd64/jre
           Default locale: en_US, platform encoding: UTF-8
           OS name: "linux", version: "4.4.0-131-generic", arch: "amd64", family: "unix"
          

          【讨论】:

            【解决方案16】:

            基本上是JDK版本和maven-surefire插件版本之间的不兼容,在我的情况下,JDK 11.0.5不适用于surefire 3.0.0-M4,我不得不切换到3.0.0-M3并且它有效.将 forkCount 设置为 0 并不能解决问题,因为它会破坏 Jacoco 报告。

            【讨论】:

              【解决方案17】:

              我卸载了存储库中的 JDK:

              $ sudo apt purge openjdk-8-jdk
              
              $ sudo apt autoremove
              

              然后我删除了JAVA_HOME 环境变量。我的设置在我的 .bashrc 中。

              然后我通过SDKMAN重新安装了它:

              $ sdk install java 8.0.181-zulu
              

              来自他们的site

              SDKMAN!是用于在大多数基于 Unix 的系统上管理多个软件开发工具包的并行版本的工具。它提供了方便的命令行界面 (CLI) 和 API,用于安装、切换、删除和列出候选人。

              要查看要安装的其他 JDK 版本,请使用:

              $ sdk list java
              

              【讨论】:

                【解决方案18】:

                我在使用 gitlab ci 时遇到了同样的问题,将 maven 映像从 maven:3-jdk-8 更改为 maven:3.6.0-jdk-8-alpine 似乎可以解决问题。顺便说一句,我也用maven:3.6.0-jdk-8 进行了测试,但也没有用。

                【讨论】:

                  【解决方案19】:

                  对我来说,在 Visual Studio Code 中

                  我没有对 pom.xml 文件进行任何更改或更新任何依赖版本
                  将此行添加到 Visual Studio Code 的 settings.json 即可解决问题。

                  "maven.executable.options": "-DforkCount=0",
                  

                  【讨论】:

                    【解决方案20】:

                    如果您像我一样在管道中遇到问题(对我来说是在 GitLab 中,但无论如何)并且如果您使用的是 Maven JDK 8 Docker 映像。

                    你可以替换

                    image: maven:3.5.4-jdk-8
                    

                    最后一个工作版本

                    image: maven@sha256:b37da91062d450f3c11c619187f0207bbb497fc89d265a46bbc6dc5f17c02a2b
                    

                    【讨论】:

                    • 问题来自debian的最新jdk8,我认为“修复”核心问题比尝试解决它更好。
                    • sha256 听起来很棘手,你害怕吗?实际上,其他答案看起来更像是一种变通方法,从surefire中禁用某些功能,这里只是使用最后一个工作的docker镜像而不改变你的工作pom或管道,这是一种变通方法。
                    猜你喜欢
                    • 1970-01-01
                    • 2011-05-09
                    • 2013-12-05
                    • 2011-07-28
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-12-11
                    • 2015-12-26
                    • 1970-01-01
                    相关资源
                    最近更新 更多