在 GitHub 上叉我

关闭分叉的 JVM

嵌入式关机

测试集完成后,将执行java.lang.System.exit(0)启动关闭挂钩的进程。此时该进程可能会运行下一个 30 秒,直到所有非守护线程终止。经过一段时间后,该进程将自行终止java.lang.Runtime.halt(0)。可以通过配置参数自定义 30 秒的超时时间forkedProcessExitTimeoutInSeconds

Ping 分叉的 JVM

由于 Surefire 插件 2.20.1 ping 依赖于平台,如果无法识别 Maven 进程或平台的 PID,则会回退到旧机制,因此 Java 中的本机命令会失败。

只需该机制检查它 Maven PID 是否仍然存在,并且操作系统不会在另一个应用程序中重用它。如果 Maven 进程已经死亡,则分叉的 JVM 将被杀死。

实施:取决于 Maven PID

  • Java 9 调用 ProcessHandle.current().pid() ,或
  • /proc/self/stat 在 Linux 和 /proc/curproc/status BSD上解析 PID ,或
  • JMX 调用 ManagementFactory.getRuntimeMXBean().getName()

在类 Unix 系统上,进程的正常运行时间由 native command 确定 (/usr)/bin/ps -o etime= -p [PID]

在 Windows 上,开始时间是 wmic process where (ProcessId=[PID]) get CreationDate 在分叉的 JVM 中确定的。

自 Surefire Plugin 2.19 起,旧机制明显变慢:

主进程每 10 秒向分叉的 JVM 发送 NOOP 命令。分叉的 JVM 每 20 秒等待一次命令(自 2.20.1 版起更改为 30 秒,请参阅SUREFIRE-1302)。如果主进程被杀死(收到 SIGKILL 信号)或关闭(按 CTRL+C,收到 SIGTERM 信号),则分叉的 JVM 在超时等待期后被杀死。

注意:在版本之后,必须通过将配置参数设置为或3.0.0-M4来启用此功能。enableProcessCheckerpingall

通过停止构建来关闭分叉的 JVM

通过发送 SIGTERM 信号或按 CTRL+C 关闭构建的主进程后,主进程立即向每个分叉的 JVM 发送 SHUTDOWN 命令。默认情况下(配置参数shutdown=testset)分叉的 JVM 不会选择新的测试,这意味着当前的测试可能仍会继续运行。SIGTERM 信号触发在分叉的 JVM 中执行的 Java shutdownhook java.lang.Process.destroy()(取决于 VM 和 OS,并不总是可靠)。该参数shutdown可以配置其他两个值exitkill。在主进程收到 SIGTERM 后执行使用exit分叉的 JVM 。java.lang.System.exit(1)使用killJVM 执行java.lang.Runtime.halt(1),例如:

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M5</version>
        <configuration>
          <shutdown>kill</shutdown>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

注意:在版本之后,必须通过将配置参数设置为or或3.0.0-M4来启用此功能。enableProcessCheckerpingnativeall

在特定超时后关闭分叉 JVM

forkedProcessTimeoutInSeconds在每个单独的进程经过一定时间后,使用参数分叉的 JVM 将被单独杀死,并且整个插件失败并显示错误消息:

There was a timeout in the fork

崩溃的分叉 JVM 导致列出崩溃的测试

在 JVM 突然退出后,Crashed tests:如果整个测试集尚未完成,控制台会列出带有崩溃测试列表的消息。如果测试退出、终止 JVM 或分段错误使 JVM 崩溃,就会发生这种情况。在这种情况下,您可能会对报告目录中生成的转储文件感兴趣,请参阅常见问题解答