Maven surefire无法找到ForkedBooter类

Syl*_*dis 210 java maven maven-surefire-plugin

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

每次我在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
Run Code Online (Sandbox Code Playgroud)

后来:

[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?
Run Code Online (Sandbox Code Playgroud)

我正在使用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)
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 244

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

正如您所看到的,错误跟踪工作,问题缩小了,并且有一个固定的软件包可供使用,新版本的surefire插件即将推出!

  • 以下是surefire-maven-plugin问题跟踪器中的相应问题:https://issues.apache.org/jira/browse/SUREFIRE-1588(它仍然是相关OpenJDK更改的Canonical/Debian backport中的错误). (2认同)

Mar*_*orn 51

将useSystemClassloader设置为false:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <useSystemClassLoader>false</useSystemClassLoader>
    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

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


小智 50

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


小智 37

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

_JAVA_OPTIONS=-Djdk.net.URLClassPath.disableClassPathURLCheck=true
Run Code Online (Sandbox Code Playgroud)


Jes*_*ick 25

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

<profile>
    <id>SUREFIRE-1588</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <argLine>-Djdk.net.URLClassPath.disableClassPathURLCheck=true</argLine>
    </properties>
</profile>
Run Code Online (Sandbox Code Playgroud)

  • @Nikolai上面的代码片段需要包含在`<settings> <profiles> ... </ profiles> </ settings>`中. (3认同)

bru*_*osg 12

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

改变它来maven:3.5.4-jdk-8-alpine解决问题.


Aru*_*nan 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>
Run Code Online (Sandbox Code Playgroud)


Grz*_*zes 7

当对3.6.0-jdk-8图像使用GitLab CI / CD时,仅以下属性有所帮助(无需修改pom.xml)。

-Dsurefire.useSystemClassLoader=false
Run Code Online (Sandbox Code Playgroud)


小智 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代码来解决此问题。


far*_* g. 5

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

-DforkCount=0
Run Code Online (Sandbox Code Playgroud)

  • 这不会为运行测试创建新的 VM,因此测试可能会影响主构建 VM。 (2认同)