Maven surefire无法找到ForkedBooter类


217

最近进入一个新项目,我正在尝试编译我们的源代码。昨天一切正常,但是今天又是另一个故事了。

每次我在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)

1
我在clircle-ci中遇到这个错误。Surefire fork和fork的vm打印以下消息并退出:“错误:无法找到或加载主类org.apache.maven.surefire.booter.ForkedBooter”。该消息位于target / surefire-reports / *。dumpstream中。如果您使用-X运行maven,它将打印命令行,您可以尝试一下并查看vm打印此消息。
布鲁诺·库蒂尼奥


我的解决方案是停止使用任何版本的open-jdks。根本无法承受这种不可靠性。
Adrian M.

使用maven的dependencyManagement部分来指定不同版本的插件
jogaco

在Debian上更新到jdk 11对我来说是一个确定的解决方案!
clearlight '19

Answers:


251

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

这是您刚刚升级到的openjdk-8软件包中的一个现已修复的 错误(行为无需明显偏离上游;丢失了上游补丁以恢复为禁用安全检查)。但这也是surefire插件SUREFIRE-1588中的一个错误,据说已在surefire 3.0.0-M1中修复:显然,它在Java将来只允许相对路径名的位置使用绝对路径(并且Debian激活了未来的行为)。

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

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

注意191-b12!= 181-b13。191-b12安全补丁是几天前发布的,显然维护人员希望将它们快速提供给您。完全更新到191-b12可能需要进行额外的测试(嗯,显然应该进行此上传)。

有几种解决方法:

  1. 您可以从snapshots.do安装先前的软件包 。降级后,您可以使用来禁止损坏的版本(如果您使用的是aptitude而不是aptsudo aptitude forbid-version openjdk-8-jre-headless。对于常规的“ apt”,我没有看到类似的禁止机制,因此您可能需要使用apt pinning来防止重新安装此升级(或者您只是继续降级,希望很快能解决)。
  2. 根据错误跟踪,-Djdk.net.URLClassPath.disableClassPathURLCheck=true使用任何常用方法(例如JAVA_FLAGS)设置属性也将有所帮助。但是我自己还没有验证。显然,您甚至可以添加变通方法以~/.m2/settings.xml轻松地为所有Maven构建启用它。

如您所见,错误跟踪有效,问题已缩小,并且提供了固定的软件包,并且新版本的surefire插件即将推出!


@AdrianMadaras到目前为止,我还没有得到新的更新,只有-2版本。还没有发布固定上传的公告,但正在进行中。您可能只是重新升级到了已知的有问题的版本。
Erich Schubert

1
我在使用OpenJDK 10.0.2的Ubuntu 18.04上遇到了相同的问题。将JAVA_HOME切换到我的“ java-9-oracle”安装程序已将其修复。
RobAu

2
这是surefire -maven-plugin问题跟踪器中的相应问题:issues.apache.org/jira/browse/SUREFIRE-1588(这仍然是相关OpenJDK更改的Canonical / Debian 反向移植中的错误)。
mirabilos '18 -10-31

1
解决方法1.对我来说没有意义,因为这是我遇到此问题的版本。覆盖maven-surefire-plugin以不使用SystemClassLoader也不起作用
Edwin Diaz-Mendez

1
您也可以尝试升级到surefire 3.0.0-M1。但是2到3里程碑版本当然可以打破其他问题。
Erich Schubert

54

将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不应坚持旧版本,也不应覆盖它们。这会导致不必要的责任冲突。
tibor17

52

我找到了解决方法,并修复了我的测试:配置maven-surefire-plugin不使用系统类加载器。


根据maven-surefire-plugin维护者的说法,所有变通办法(将此设置forkCount为0或argLine全局设置)都存在问题,无法普遍应用。
mirabilos

好发现。但是,请在您的帖子中包含实际的解决方法文字,或者至少将链接明确标识为stackoverflow链接。即@markoorn使用的方法更有用。
nealmcb

38

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

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

通常不会无故地引入标记为安全修复程序的重大更改,以便有人告诉SO如何禁用它...只是
说说而已

26

在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 <profile>... @1:9) @ /home/nikolai/.m2/settings.xml, line 1, column 9
Nikolai

3
@Nikolai上面的代码段需要放在中<settings><profiles>...</profiles></settings>
qqx

13

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

更改它可以maven:3.5.4-jdk-8-alpine解决问题。


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>

8

当将GitLab CI / CD与 3.6.0-jdk-8图像只有下面的属性有所帮助(无需修改pom.xml)。

-Dsurefire.useSystemClassLoader=false

这又是一个坏习惯。正确的是升级版本。始终检查Maven Central中的版本。
tibor17

5

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

看来 3.5.4-jdk-8图像导致升级到次要Java版本,从而以某种方式影响了Surefire的分叉机制。

回滚3.5.3-jdk-8图像可以在我的GitLab CI服务器上使用Surefire 2.20.1构建Java 1.8代码来解决此问题。


5

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

-DforkCount=0

2
这样的结果是不会创建新的VM来运行测试,因此测试可能会影响主构建VM。
圣保罗Ebermann

4

对于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

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

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

正如Erich所提到的,这是Debian软件包中的一个错误,即911925过于严格,并且Surefire插件未按照新规则SUREFIRE-1588起作用


为什么有人建议安装没有安全补丁的版本?尽管其他建议包括跳过测试,但是。
berezovskyi

1
您不再需要:-)它是固定的。但是与此同时,我有许多必须处理的Java项目,而Java运行时却无处暴露于外部的任何新代码。因此,对于我来说,存在一个可以监督的风险。毕竟这是每个人自己的决定:-)
飘飘

其实您是对的,我发现JDK开发人员默认情况下返回了该道具集:hg.openjdk.java.net/jdk/jdk/rev/f54dcfc5a5f8 ; 但实际上,将主要版本升级到surefire似乎不是我的最佳解决方案。
berezovskyi

1
绝对!但是他们必须进行的更改遍及整个代码库,并且具有很大的侵入性。因此,对于此修复程序进行较小的版本更改将不会在surefire中进行。

1
不幸的是,2.x已停产,我们必须迟早进行切换:issues.apache.org/jira/browse/…–
berezovskyi

2

我已经将依赖项添加到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>

这个木星插件会产生什么黑魔法?这对我有用!赞!:-)
Hinotori

1

我最近在詹金斯(Jenkins)上设置了Maven工作,并陷入了同样的问题。我建议修改JAVA env变量并确认问题已解决。这就是我测试的方式。

成为“ 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"

1

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

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

1

基本上是JDK版本和maven-surefire插件版本之间不兼容,在我的情况下,JDK 11.0.5不能与surefire 3.0.0-M4一起使用,我必须切换到3.0.0-M3才可以。将forkCount设置为0不能解决问题,因为它破坏了Jacoco报告。


0

我卸载了存储库中随附的JDK:

$ sudo apt purge openjdk-8-jdk

$ sudo apt autoremove

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

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

$ sdk install java 8.0.181-zulu

从他们的网站

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

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

$ sdk list java

0

我在gitlab ci上遇到了同样的问题,将Maven映像从更改maven:3-jdk-8maven:3.6.0-jdk-8-alpine似乎可以解决此问题。顺便说一句,我也进行了测试,maven:3.6.0-jdk-8但是它也不起作用。


0

这仍然是一个问题的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>
...

-1

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

您可以更换

image: maven:3.5.4-jdk-8

到最后一个工作版本

image: maven@sha256:b37da91062d450f3c11c619187f0207bbb497fc89d265a46bbc6dc5f17c02a2b

1
该问题来自于最新的debian jdk8。在我看来,“解决”核心问题胜于尝试解决该问题。
西勒迪斯(Sylordis)'18 -10-31

sha256的声音有些棘手,害怕吗?实际上,其他答案更像是一种变通方法,请从surefire禁用某些功能,此处仅使用最后一个工作的docker映像,而无需更改变通的工作pom或管道。
amdev '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.