【问题标题】:Docker->Maven->Failsafe->Surefire starting fork fails with "The forked VM terminated without properly saying goodbye. VM crash or System.exit called?"Docker->Maven->Failsafe->Surefire 启动 fork 失败,并显示“分叉的 VM 在没有正确告别的情况下终止。VM 崩溃或 System.exit 被调用?”
【发布时间】:2017-10-10 15:30:28
【问题描述】:

根据标题:我正在尝试从容器化的 Jenkins slave 运行 Maven 自动化测试,在与此作斗争一周后,我的想法已经不多了。它在具有 4G RAM 的 AWS 实例上按原样工作,但在不受限制的(在 RAM 和 CPU 上)容器中,它失败并出现如下错误。它运行的唯一情况是我禁用了 Failsafe 插件的分叉,但这不是未来的选择。

我尝试了各种我可以使用 Google 找到的 Java/Maven/Failsafe/Surefire 选项,但没有运气(比如添加全局 Java -Xmx 选项以及 pom.xml 中的每个插件)。

有人这样成功运行过吗?

看起来这应该更容易处理,但如果我有头发的话,我现在已经把头上的所有头发都拔掉了。我仍然不喜欢承认失败的想法。请帮忙!

这些是插件在失败后创建的转储:

failsafe-summary.xml:

<?xml version="1.0" encoding="UTF-8"?>
<failsafe-summary xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://maven.apache.org/surefire/maven-sure
fire-plugin/xsd/failsafe-summary.xsd" result="254" timeout="false">
    <completed>0</completed>
    <errors>0</errors>
    <failures>0</failures>
    <skipped>0</skipped>
    <failureMessage>org.apache.maven.surefire.booter.SurefireBooterForkException: The forked VM terminated without properly saying goodbye. VM cras
h or System.exit called?
Command was /bin/sh -c cd /var/lib/jenkins/workspace/ui_acceptance_test_chrome_docker_freestyle &amp;&amp; /usr/lib/jvm/java-1.8-openjdk/jre/bin/ja
va -Dfile.encoding=UTF-8 -jar /var/lib/jenkins/workspace/ui_acceptance_test_chrome_docker_freestyle/target/surefire/surefirebooter81206735832436906
05.jar /var/lib/jenkins/workspace/ui_acceptance_test_chrome_docker_freestyle/target/surefire 2017-10-10T15-02-35_189-jvmRun1 surefire59539140137458
58339tmp surefire_03559885505222114015tmp
Error occurred in starting fork, check output in log
Process Exit Code: 1
       at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:686)
       at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:535)
       at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:280)
       at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:245)
       at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:1124)
       at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:954)
       at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:832)
       at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
       at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:207)
       at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
       at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
       at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
       at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
       at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
       at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
       at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
       at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
       at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
       at org.apache.maven.cli.MavenCli.execute(MavenCli.java:863)
       at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
       at org.apache.maven.cli.MavenCli.main(MavenCli.java:199)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
       at java.lang.reflect.Method.invoke(Method.java:498)
       at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
       at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
       at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
       at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
</failureMessage>
</failsafe-summary>

2017-10-10T15-02-35_189-jvmRun1.dump:

# Created on 2017-10-10T15:02:36.303
Killing self fork JVM. Maven process died.

【问题讨论】:

  • 您是否已经找到此问题的原因和可能的解决方法?我也遇到了类似的问题 - stackoverflow.com/questions/46831762/…
  • 很遗憾,我没有。我怀疑这可能与内存有关,但还没有遇到任何人真正了解 Java 使用过多的插件和分叉如何管理内存以及它与 -Xmx 等选项的关系以及应该在哪里设置(全局,在 Maven 中,每个插件??)。最近不得不转移到另一份工作......现在。

标签: java maven docker containers maven-surefire-plugin


【解决方案1】:

尝试降级到 Surefire 1.18.1。今晚我遇到了这个问题并花了几个小时,到目前为止,为什么新版本的 Surefire 在 Docker 下会中断并不容易。

* 更新 *

我在使用 Alpine linux 时遇到了问题,但是当使用 Ubuntu 或 Debian 基础映像时,一切都很好。所以 1.21 中的某些东西破坏了与某些操作系统的兼容性。

【讨论】:

  • 赞成,虽然我只降级到 2.18.1(...我想这实际上是你的意思?)
  • 对于在 CircleCI 上失败的构建,这也对我有用(降级到 surefire 2.18.1)
  • 2.20 有效,2.21 无效。这里有一个错误报告issues.apache.org/jira/browse/SUREFIRE-1444 看起来很相似,我将添加一些细节。
  • 使用 2.20.1 版的 maven-surefire-plugin 和 1.2.0 版的 junit-platform-surefire-provider 和 5.2.0 版的 junit-jupiter-engine 不适用于我截至今天的 Alpine Linux openjdk:8-jdk-alpine 映像。切换到 openjdk:8-jdk 镜像就可以了。
【解决方案2】:

我在以下环境中遇到了同样的问题:docker image from alpine 3.7, maven surefire plugin version 2.21.0。

SUREFIRE-1422 描述了其根本原因:surefire 尝试使用ps -p 来检查分叉进程。我的解决方案是添加 procps:

RUN apk add --no-cache procps

【讨论】:

  • 还有一个讨厌 Alpine 的理由!浪费了很多时间:(谢谢?
  • 这也发生在我使用 debian 拉伸图像作为基础...所以不要单独责怪 Alpine,还要责怪肯定插件的创建者。
【解决方案3】:

我知道这已经有一段时间了,但我会添加我的解决方案来解决我花了一天多时间来修复的问题。

问题:我在 docker 容器的 PaaS 中运行我的集成测试,并且无法控制我的进程的内存分配。默认行为是故障安全/surfire 派生一个 JVM 并在其上运行测试。我找不到一种方法来控制分叉 JVM 的内存分配,并且测试一直失败并出现错误“启动分叉时发生错误”还在日志中看到“分叉的虚拟机终止而没有正确告别 docker”,具体取决于哪个版本我正在尝试故障保护。

解决方案:我的解决方案是禁用 JVM 的分叉,并让所有测试在与主 maven 进程相同的 JVM 中运行,现在这对许多人来说可能不是理想的解决方案,但它会如果您只能控制主 maven 进程的最大内存分配,则可以工作。

要禁用分叉,只需在配置中设置 forkMode:

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

.....

更新: 由于给出了这个解决方案,您现在似乎可以将参数传递给分叉的 JVM,因此不需要早期的解决方案。

来自分叉测试执行下的 maven 文档:

使用argLine 属性,您可以指定附加参数以 被传递给分叉的 JVM 进程,例如内存设置。系统 来自主 maven 进程的属性变量被传递给 分叉的过程也是如此。此外,您可以使用元素 systemPropertyVariables 指定要添加到的变量和值 测试执行期间的系统属性。

https://maven.apache.org/surefire/maven-failsafe-plugin/examples/fork-options-and-parallel-execution.html

【讨论】:

  • 感谢您的回答。花了几个小时解决了这个问题!
  • maven-surefire-plugin 中将 forkCount 设置为 0 对我有用。谢谢!
【解决方案4】:

我们突然遇到了完全相同的问题,但只是在我们的 CI/CD 管道 (gitlab) 上。 错误信息是:

error occurred in starting fork, check output in log
Process Exit Code: 1
org.apache.maven.surefire.booter.SurefireBooterForkException: 
The forked VM terminated without properly saying goodbye. VM crash or System.exit called?

原来是和新版本的OpenJDK docker镜像有关。

useSystemClassLoader 属性设置为false 解决了这个问题:

   <plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>${maven-surefire-plugin.version}</version>
    <configuration>
      <includes>
        <include>**/*Test.java</include>
      </includes>
      <useSystemClassLoader>false</useSystemClassLoader>
    </configuration>
  </plugin>

【讨论】:

    【解决方案5】:

    在 alpine 和 docker (zenika/alpine-maven) 上使用带有 Surefire 版本 2.21.0 的 Spring Boot 时,我们遇到了同样的问题。如前所述,降级到 2.18.1 可能是一种选择并解决了分叉的 vm 终止问题,但引发了不同 slf4j 版本之间不兼容的新问题。因此,我们明确升级到了 surefire 版本 2.22.1,这解决了我们案例中的问题。

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.22.1</version>
    </plugin>
    

    【讨论】:

      【解决方案6】:

      使用 surefire 2.21.0 在 maven:3.5.4-jdk-8 中构建时遇到了同样的问题。 升级surefire也无济于事,但禁用分叉终于成功了。

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

      【讨论】:

        【解决方案7】:

        无论我多么努力,我都无法解决这个问题。 删除了 java 11 并安装了 java 8 修复了所有问题。

        sudo add-apt-repository ppa:openjdk-r/ppa -y
        sudo apt update
        sudo apt install openjdk-8-jdk openjdk-8-jre
        

        【讨论】:

          【解决方案8】:

          我可以确认我在 Fedora docker 映像 (2020) 上也遇到了这个问题 - 只需将 maven-surefire-plugin 升级到 >=2.22.0 即可。

          (http://raehal.me/maven-surefire-plugin-on-Docker/)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-01-05
            • 2014-06-09
            • 1970-01-01
            • 2017-11-09
            • 2018-07-15
            相关资源
            最近更新 更多