Maven surefire无法找到ForkedBooter类

问题描述 投票:202回答:17

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

每次我在模块上运行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?

我正在运行Debian 9(Stretch)64位​​,OpenJDK 1.8.0_181,Maven 3.5.4,在我的公司代理后面工作,我在~/.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)
java maven maven-surefire-plugin
17个回答
244
投票

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

正如您所看到的,错误跟踪工作,问题缩小了,并且有一个固定的软件包可用,并且很快就会出现新版本的surefire插件!


4
投票

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

-DforkCount=0

4
投票

对于Ubuntu:安装最新版本,它修复了这个错误

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

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

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-plugin并没有按照新规则SUREFIRE-1588行事。


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"

0
投票

我卸载了存储库中的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

0
投票

我正面临与gitlab ci相同的问题,将qvenxswpoi的maven图像改为maven:3-jdk-8似乎解决了这个问题。顺便说一句,我也用maven:3.6.0-jdk-8-alpine进行了测试,但它也没有用。


0
投票

我已经添加了对junit-jupiter-engine的依赖,并且它有效。

maven:3.6.0-jdk-8

-1
投票

如果像我一样,你的管道中存在问题(对我而言,它在GitLab中,但无论如何),如果你使用的是Maven JDK 8 Docker镜像。

你可以替换

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

通过最后的工作构建

image: maven:3.5.4-jdk-8

-7
投票

我被用作解决方法来停止编译和执行测试文件:

image: maven@sha256:b37da91062d450f3c11c619187f0207bbb497fc89d265a46bbc6dc5f17c02a2b

49
投票

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


48
投票

将useSystemClassloader设置为false:

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

如果您不是从具有为您定义的版本的父级继承(例如Spring Boot启动程序),那么您还需要定义它。


37
投票

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

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

25
投票

我发布了一个更具针对性的变体,上面的解决方法之一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>

11
投票

我在我的GitLab CI版本中遇到了这个问题,它使用的是maven:3.5.4-jdk-8 Docker镜像。

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


7
投票

我按照这个链接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>

6
投票

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

-Dsurefire.useSystemClassLoader=false

5
投票

对于那些在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代码。

© www.soinside.com 2019 - 2024. All rights reserved.