Docker-> Maven-> Failsafe-> Surefire启动分叉失败,“分叉的虚拟机在没有正确说再见的情况下终止。虚拟机崩溃或System.exit被调用?”

时间:2017-10-10 15:30:28

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

按照标题:我正试图从集装箱化的詹金斯奴隶那里运行Maven自动化测试,经过一个星期的斗争,现在我已经没有想法了。它在具有4G RAM的AWS实例上工作,但在不受限制的(在RAM和CPU上)容器中,它失败并出现如下错误。它运行的唯一情况是我禁用Failsafe插件的分配,但这不是一个选项。

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

有没有人像这样成功地运行它?

这似乎应该更容易处理,但是如果我有任何头发,我现在已经把头发拉到头上了。我仍然不喜欢承认失败的想法。请帮忙!

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

故障安全-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.

8 个答案:

答案 0 :(得分:16)

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

*更新*

我遇到了Alpine linux的问题,但是当使用Ubuntu或Debian基本图像时,一切都很好。因此1.21内的某些内容破坏了与某些操作系统的兼容性。

答案 1 :(得分:9)

我在以下环境中遇到了同样的问题:来自alpine 3.7的docker镜像,maven surefire插件版本2.21.0。

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

RUN apk add --no-cache procps

答案 2 :(得分:7)

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

问题:我在Docker容器中的PaaS中运行集成测试,无法控制我的进程的内存分配。默认行为是failafe / surfire分叉JVM并对其运行测试。我找不到一种方法来控制该分叉JVM的内存分配,并且测试因错误而失败&#34;启动fork&#34;还看到了#34;分叉的虚拟机终止了,但没有说得好再见的码头工人&#34;在日志中,取决于我正在尝试的故障安全版本。

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

要禁用分支,就像在配置中设置forkMode一样简单:

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

.....

<强>更新 由于提供此解决方案,您现在似乎可以将params传递给分叉的JVM,因此不需要早期的解决方案。

来自Forked Test Execution下的maven文档:

  

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

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

答案 3 :(得分: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>

答案 4 :(得分:1)

在带有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>

答案 5 :(得分:1)

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

expand

答案 6 :(得分:1)

无论我怎么努力,我都无法解决。 删除了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

答案 7 :(得分:0)

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

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