分叉的VM没有正确地说再见就终止了。虚拟机崩溃或系统崩溃。出口被称为

请帮我解决这个问题。我不太明白日志中的错误是什么意思。

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 21.749s
[INFO] Finished at: Thu Apr 24 10:10:20 IST 2014
[INFO] Final Memory: 15M/37M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.15:test (default-test) on project samples.simpleforwarding: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.15:test failed: The forked VM terminated without saying properly goodbye. VM crash or System.exit called ?
[ERROR] Command wascmd.exe /X /C ""C:\Program Files\Java\jdk1.7.0_55\jre\bin\java" -Xmx1024m -XX:MaxPermSize=256m -jar E:\OpenDayLight\controller\opendaylight\samples\simpleforwarding\target\surefire\surefirebooter53410321571238933.jar E:\OpenDayLight\controller\opendaylight\samples\simpleforwarding\target\surefire\surefire86076271125218001tmp E:\OpenDayLight\controller\opendaylight\samples\simpleforwarding\target\surefire\surefire_01846991116135903536tmp"
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginExecutionException
319265 次浏览

成功的常见问题的这一部分可以帮助你:

Surefire失败,提示“the fork VM terminated without proper say goodbye”;

Surefire在任何时候都不支持调用System.exit()的测试或任何引用库。如果他们这样做,他们与surefire不兼容,你可能应该向库/供应商提交一个问题。另外,分叉的虚拟机也可能因为一些原因崩溃,这也可能导致这个问题的发生。寻找经典的“;hs_err*"指示VM崩溃的文件或在测试执行时检查运行maven的日志输出。一些“extraordinary"崩溃进程的输出可能被转储到控制台/日志中。如果这种情况发生在CI环境中,并且只在运行一段时间后才发生,那么您的测试套件很有可能泄漏某种操作系统级资源,使每次运行都变得更糟。常规的操作系统级监视工具可能会给您一些提示。

可能是因为你在你的项目中应用了一些更改,没有更新他们所有的引用。

在我的情况下,我得到这个错误,因为我已经更新了包的名称在我的项目,但我忘记更新他们的引用在TestNG.xml文件。通过修正,我解决了这个错误。

对我来说很管用

mvn clean install -DskipTests -e

您需要检查您的机器是64位还是32位。如果你的机器是32位的,那么你的内存参数不应该超过4096,即使它应该低于4 GB。 但如果你的机器是64位的,那么安装Java 64位,并在mvn.bat中提供JAVA_HOME,指向Java 64位安装

在我的测试类中的一个静态成员变量调用一个方法来创建一个对象(在整个类的测试用例中使用),并且该方法导致了一个异常之后,我遇到了这个错误。

// Object created inside test class by calling a static getter.
// Exception thrown in getter:
private static Object someObject = SomeObject.getObject(...);


// ... <Object later used in class>

一些修复包括在每个测试用例中重新创建对象,并相应地捕获任何异常。或者通过在@BeforeTest方法中初始化对象并确保正确地构建对象。

我今天也遇到了同样的问题,对我来说,真正的问题是在日志中进一步报告的消息Cannot use a threadCount parameter less than 1; 1 > 0。 当在surefire-plugin配置中添加<threadCount>1</threadCount>时,另一个错误消失 完整插件配置:
        <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>2.18.1</version>
</dependency>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-testng</artifactId>
<version>2.18.1</version>
</dependency>
</dependencies>
<configuration>
<threadCount>1</threadCount>
</configuration>
</plugin>

...是的,为了向后兼容,我在这个测试框架中同时使用了junit和testng。

我也遇到了同样的问题,并添加了如下内容:

<argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>

整个plugin元素是:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<forkCount>3</forkCount>
<reuseForks>true</reuseForks>
<argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
</configuration>
</plugin>

在我的案例中,这个问题与工作区路径太长有关。所以我做了一个路径重构,这解决了我的问题。

当我遇到这个错误时,这是由于我的ulimit for open files (ulimit -n)太低。它(不知何故)被设置为仅256:

% ulimit -n
256

在我增加限制后,错误消失了:

% ulimit -n 3072
% ulimit -n
3072

您的系统可能不允许将限制设置得这么高。例如,当我试图使用更大的数字时,就会发生这种情况:

% ulimit -n 3073
ulimit: setrlimit failed: invalid argument

或者这可能低于您现有的限制,您可能面临不同的根本原因。

如果有人包含自定义argLine参数,则必须重新考虑,因为它很可能是内存分配问题的根源。

例如(我曾经有过):

<argLine>XX:MaxPermSize=4096m ${argLine}</argLine>

现在我使用硬指定值:

<argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>

无论出于何种原因,与Surefire集成的应用程序(如Jacoco)不会请求足够的内存来与构建时发生的测试共存。

在我的例子中,我忘记在pom中添加依赖项:

      <dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.5</version>
</dependency>

只要确保你选择了正确的版本(目前1.8.9是最新的)

我在Ubuntu机器上的Jenkins构建过程中遇到了这个问题。

/var/log/syslog报告Out of memory: Kill process 19557 (java) score 207 or sacrifice child

因此,我给了Ubuntu机器更多的交换空间。从那以后,这个问题就不存在了。

我也经历过这种情况-但在我的情况下,我为黄瓜编写了一个自定义钩子

public class MappingFormatter implements gherkin.formatter.Formatter {

...

我的方法之一是产生一个空指针异常,这导致surefire退出而不记录错误。

分叉的VM没有正确地说再见就终止了。虚拟机崩溃或系统崩溃。出口被称为

防止此错误的方法是以管理员身份运行IDE。

在JDK 1.8.0_65上使用Jacoco插件运行mvn命令时有类似的问题

[INFO]
A fatal error has been detected by the Java Runtime Environment:


JRE version: Java(TM) SE Runtime Environment (8.0_65-b17) (build 1.8.0_65-b17).........
Problematic frame:
PhaseIdealLoop::build_loop_late_post(Node*)+0x144
............
............
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.19:test (default-test) on project


The forked VM terminated without properly saying goodbye. VM crash or System.exit called?

JDK https://bugs.openjdk.java.net/browse/JDK-8081379中有一个错误

解决方案是用参数- xx: -UseLoopPredicate运行mvn clean install

或者只是对JDK进行更新(我认为更新的小版本也可以)

最近特拉维斯终止了一个测试的执行(没有改变任何相关的东西(以及在开发人员机器上成功的构建!)),因此构建失败. c。 原因之一是这个(见@agudian的答案):

Surefire不支持调用System.exit()的测试或任何引用库

(因为测试类确实被称为System.exit(-1))。

  1. 相反,使用简单的return语句会有所帮助。

  2. 为了让travis再次开心,我还必须添加@xiaohuo提供的可靠参数(<argLine>)。(此外,我必须删除-XX:MaxPermSize=256m才能在我的一个桌面上构建)

只做这两件事中的一个是行不通的。

更多背景信息请阅读什么时候调用系统。Java退出

这也可能是由于一个完全不同的问题。例如,在我的案例中,我们的Jenkins构建在执行测试时毫无理由地间歇性失败。

我筛选了我们的测试,以找到任何System.exit()的出现,但没有。

经过更多的挖掘,我发现这可能是因为JDK的bug导致了这种回归。

JDK-6675699

我仍在努力在我们的构建中修复这个问题,将回来并再次更新线程。

这可能是由于内存不足造成的。确保在运行mvn时没有任何应用程序在后台运行。在我的例子中,Firefox在后台运行,内存占用率很高。

这将工作肯定.....

在POM文件中添加以下行并给出一个构建。

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<trimStackTrace>false</trimStackTrace>
<includes>
<include>**/*Test.class</include>
</includes>
</configuration>
</plugin>

导致:java.util.concurrent.ExecutionException: java.lang.RuntimeException:分叉虚拟机未正确告别而终止。虚拟机崩溃或系统崩溃。退出叫什么?”

如果您使用不兼容的Java版本,则可能发生此问题。喜欢使用新版本的java,而代码支持一些其他版本。

当我试图在运行JAVA = 1.8的windows 10环境上编译一个设置为1.7的maven项目时,确实遇到了同样的问题。

我通过将java版本从1.7更改为1.8来解决这个问题,如下所示。

 <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>

我最近在用Bamboo构建我的容器容器应用程序时遇到了这个错误:

surefirebooterforkexception:分叉虚拟机没有正确地说再见就终止了

经过几个小时的研究,我把它修好了。我想在这里分享一下我的解决方案会很有用。

因此,每当bamboo在docker容器中为java应用程序运行mvn clean package命令时,都会发生错误。我不是Maven专家,但问题是spring-boot中包含的Surefire和Junit4插件作为Maven依赖项。

要解决这个问题,你需要替换Junit4为Junit5,并覆盖你pom.xml中的Surefire插件。

1.在spring引导依赖插入排除:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<!-- FIX BAMBOO DEPLOY>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
<!---->
</dependency>

2. 添加新的Junit5依赖项:

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.1.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>5.1.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>1.1.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-runner</artifactId>
<version>1.1.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.1.0</version>
<scope>test</scope>
</dependency>

3.在插件部分中插入新插件

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.1.0</version>
</dependency>
</dependencies>
</plugin>

这应该足够修复竹制建筑了。不要忘记转换所有Junit4测试以支持Junit5。

我有非常相似的问题(Maven build和Maven -failsafe-plugin——分叉的虚拟机没有恰当地说再见就终止了),并找到了三个解决方案,这对我来说是有效的:

问题描述

问题是maven插件maven-surefire-plugin只在2.20.1和2.21.0版本。我查过了,你用的是2.20.1版本。

解决方案1

升级插件版本到2.22.0。在pom.xml中添加:

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

解决方案2

将插件版本降级到2.20。在pom.xml中添加:

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

解决方案3

使用插件配置testFailureIgnore。在pom.xml中添加:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>

我遇到过一个案例,其中没有一个答案能解决问题。它是一个遗留应用程序,恰好使用log4j和SLF4J/logback。

前面的情况:clean test构建从Eclipse中启动时运行良好,但在命令行中启动时,出现了此错误。基于CircleCI的CI构建也运行良好。

我所做的是:出于纯粹的猜测,配置一个适当的logback-test.xml并降低日志记录的冗长程度。你瞧,我再也没有遇到过这个错误,我现在可以从命令行构建项目(以及发生这个错误的模块)。

我的观点是日志框架的使用或配置方式可能是另一种解释

log4j和logback之间真的有冲突吗?或者仅仅是测试产生的大量日志以某种方式溢出了命令行缓冲区?我不知道。这对我来说仍然是个谜。

在我的情况下,这个问题与IntelliJ IDEA控制台输出的日志太长有关(OS windows 10)。
< br >命令:

mvn clean install
这个命令解决了我的问题:

mvn clean install > log-file.log

我解决这个问题的方法是关闭该死的chrome浏览器,它正在阻塞我的计算机内存🙄

截至今天(2018年10月30日),我们注意到我们的构建在Jenkins中出现了这个错误。

这个错误有点误导人,需要查看target/surefire-reports/中转储的输出才能看到以下错误消息:

Error: Could not find or load main class org.apache.maven.surefire.booter.ForkedBooter

这让我想到了下面的SO帖子,其中提到了OpenJDK 181中的一个可能的错误:Maven surefire找不到ForkedBooter类

那篇文章中的任何一个修复都解决了我的问题。具体来说,我使用了其中之一:

  1. 从构建docker容器maven:3.5.4-jdk-8切换到maven:3.5.4-jdk-8-alpine
  2. 重写Spring Boot的类加载器详细说明:https://stackoverflow.com/a/50661649/1228408

您可以设置java选项

SET JAVA_OPTS='-Xmx1024m' XX:+UseLoopPredicate

mvn clean install

也面临着同样的问题,ubuntu上的java 8

然后遇到了https://stackoverflow.com/a/53016532/1676516

这似乎是java 8 https://issues.apache.org/jira/browse/SUREFIRE-1588的surefire插件版本2.22.1中最近的一个错误

通过本地mvn设置~/.m2/settings.xml遵循建议的解决方案

<profiles>
<profile>
<id>SUREFIRE-1588</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<argLine>-Djdk.net.URLClassPath.disableClassPathURLCheck=true</argLine>
</properties>
</profile>
</profiles>
在pom.xml中设置这个对我来说很有效。 但是您应该查看文档以寻找其他解决方案 https://maven.apache.org/surefire/maven-surefire-plugin/examples/class-loading.html < / p >
       <plugin>


<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<!--these strange settings fixes a chrash and dumpstream from surefire when run from command line
Caused by: java.lang.ClassNotFoundException: org.apache.maven.surefire.booter.ForkedBooter
-->
<useSystemClassLoader>true</useSystemClassLoader>
<useManifestOnlyJar>false</useManifestOnlyJar>
</configuration>
</plugin>

在Windows (OpenJDK11, Maven 3.6.0, SUREFIRE 3.0.0-M1)上,我得到了根本原因:

# Created at 2018-11-14T14:28:15.629
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000006c7500000, 522190848, 0) failed; error='The paging file is too small for this operation to complete' (DOS error/errno=1455)

并通过增加分页文件大小来解决,例如

以上都试过了,都没用。下面的解决方案适合我:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<argLine>-Dfile.encoding=UTF-8</argLine>
</configuration>

关闭maven-surefile-plugin的useSystemClassLoader应该会有帮助

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

我也遇到了同样的问题,我使用了Oracle的Java 8而不是Openjdk的Java 10来解决这个问题

我在Jenkins Docker容器中也遇到了这个问题(尝试过Jenkins:lts, Jenkins, Jenkins:slim和Jenkins:slim-lts。我不想遍遍所有的存储库并为每个项目更新pom,所以我只是在maven命令行调用中添加了disableClassPathURLCheck:

mvn test -DargLine="-Djdk.net.URLClassPath.disableClassPathURLCheck=true"

使用maven surefire 2.21.0我解决了将reuseForks选项值从真正的更改为的问题:

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<configuration>
<reuseForks>false</reuseForks>
</configuration>
</plugin>
</plugins>
</build>

我正在构建的整个配置部分是这样的:

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
<skip>false</skip>
<reuseForks>false</reuseForks>
<argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
<argLine>-Dfile.encoding=UTF-8</argLine>
<useSystemClassLoader>false</useSystemClassLoader>
<includes>
<!--Test* classes for the app testing -->
<include>**/directory/Test*.java</include>
</includes>
</configuration>
</plugin>
</plugins>
</build>

测试中使用的分叉JVM内存不足。 解决方案是禁用分叉JVM并在主JVM上运行测试,以确保有足够的内存,或者传递参数以增加分叉JVM

的内存

查看这个回答中的解决方案

对于我的例子,它是我的代码调用System.exit(0)。

以下是关于它的文档摘录:

Surefire在任何时候都不支持调用System.exit()的测试或任何引用库。如果他们这样做,他们与Surefire不兼容,你可能应该向库/供应商提交一个问题。

我尝试了所有提供的解决方案(分叉,系统加载器,更多的内存等),没有工作。

环境:在gitlab ci环境中构建失败,在docker容器中运行构建。

< p > 解决方案: 我们在2.20.1版本中使用surefireplugin,升级到2.21.0或更高版本(我们使用2.22.1)修复了这个问题 < p > 导致: 成功的- 1422 - surefire使用命令ps,该命令在docker环境中不可用,导致“崩溃”。此问题在2.21.0或更高版本中修复。< / p >

感谢另一个问题的答案:https://stackoverflow.com/a/50568662/2970422

我在MacOS上远程调试端口5005上的Selenium测试代码时也遇到了这个问题。这个问题原来是由一个仍然运行的剩余的surefire-fork jvm引起的。日志输出到Eclipse IDE终端没有显示底层问题已使用的地址。只有当我在MacOS终端上运行Eclipse实际试图运行的相同命令时,才会显示日志消息:

/bin/sh -c CD /path/to/your/project/directory &&/图书馆/ Java / JavaVirtualMachines / adoptopenjdk-8。jdk/Contents/Home/jre/bin/java -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 -jar /path/to/target/surefire/surefirebooter230340673926465933.jar /path/to/target/surefire 2019-06-28T10-50-02_140-jvmRun1 surefire6455775580414993159tmp surefire_02461993428448591420tmp < /代码> < / p >

杀死流氓JVM实例(在Activity Monitor中查找java进程名)解决了这个问题。顺便说一下,我正在运行surefire插件版本2.21.0,与开放jdk 8 (v1.8.0_212)没有问题。注意,所有路径都将特定于您的构建环境,可能还有端口(address=5005)。

我在升级到java 12后遇到了类似的问题,对我来说,解决方案是更新jacoco版本<jacoco.version>0.8.3</jacoco.version>

在我的情况下,通过设置MAVEN_OPTS增加内存有助于:

set MAVEN_OPTS=-Xmx1024m

我有一个类似乍得的的情况,但找到了不同的答案。

根据插件文档,你不能在<argLine>中使用${...},因为Maven会在surefire插件(或任何其他插件)之前选择它进行替换。

自2.17版本起,插件支持__ABC0代替${...}进行属性替换。

举个例子,替换这个

<argLine>XX:MaxPermSize=1024m ${moreArgs}</argLine>

用这个

<argLine>XX:MaxPermSize=1024m @{moreArgs}</argLine>

版本2.22.2在fork jvm中存在实际问题。 使用版本2.20 -它的工作就像一个魅力!< / p >


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

我使用文件夹名As test&演示,所以它给出了这个问题(VM终止没有正确地说再见。虚拟机崩溃或系统崩溃。退出调用),但当我给文件夹名称为test_demo,然后它解决了这个问题。(这个问题存在于带有“&”符号的windows操作系统中。)

将“&”替换为“_”

此问题可能是由文件夹名称中的一些特殊符号或额外空格引起的。

我在使用maven测试运行单元测试时也遇到了同样的问题。 我试过改变那些肯定会成功的版本,但不管用。 最终成功解决如下问题: 早些时候:(当问题发生时): Javac来自JDK 1.8 Java指向JDK 1.11中的Java bin 当前:(当问题得到解决时): javac &Java指向JDK 1.8

中的bin < p >的问候 Teja . < / p >

我更新了surefire插件如下,这解决了我的问题:

           <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
<forkCount>1</forkCount>
<reuseForks>true</reuseForks>
<runOrder>alphabetical</runOrder>
</configuration>
</plugin>

这似乎是某些Windows机器上的线程同步问题。如果你在Windows上遇到这个问题,试着将输出重定向到一个文件:mvn clean install > output.txt

我在一个应用程序中遇到了同样的问题,即在运行测试时将大量XML记录到控制台。我认为这个问题与测试fork将其控制台日志发送到主maven线程以输出到屏幕的方式有关。

在我的测试日志文件中,我通过将有问题的类的日志设置为WARN来解决这个问题。

如logback-test.xml

<configuration debug="true">
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />


<logger name="com.foo.ClassWithLotsOfXmlLogging" level="WARN" />


<root level="INFO">
<appender-ref ref="CONSOLE"/>
</root>
</configuration>

我在使用Java 8和spring boot 5.2.7时也遇到了同样的问题(包括插件,开箱即用)。插件的版本是默认的(2.22.2)。在我的例子中,问题只发生在团队中的一些机器上,而在其他机器上一切正常。我猜这和maven检测到的内核数量有关。

我用这些设置来修复它:

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

我尝试了许多建议的方法,但没有一种对我的情况有效。

这个解决方案唯一的缺点是禁用分叉的重用,现在测试运行得更慢了。

添加配置文件后,我可以删除这个错误:

<profile>
<id>surefire-windows-fork-disable</id>
<activation>
<os>
<family>Windows</family>
</os>
</activation>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<forkCount>0</forkCount>
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</profile>

似乎这是一个关于maven的问题

我有这么多时间,对我来说,这几乎总是“控制台"与实际的分叉有关,但没有任何关系。

总之,我的解决方案是:

  • 添加-B(批处理模式)
  • 添加JVM参数-Djansi.force=true -Djansi.passthrough=true

在一个给定的项目中,这将在一个新的windows控制台中系统失败 (cmd.exe)

< p > [path_to_jdk] \ java.exe -Dmaven.home=[path_to_maven]\apache-maven-3.6.3 -Dclassworlds.conf=[path_to_maven]\bin. \bin\m2.conf -Dmaven.home=[path_to_maven]multiModuleProjectDirectory = path_to_myproject -Dfile。utf - 8编码= -Djansi。力= true -Djansi。passthrough=true -classpath [path_to_maven]\boot\plexus-classworlds-2.6.0.jar org.codehaus.plexus.classworlds.launcher.Launcher clean install -B

. exe

这将在一个新的控制台窗口(cmd.exe)中总是工作

< p > [path_to_jdk] \ java.exe -Dmaven.home=[path_to_maven]\apache-maven-3.6.3 -Dclassworlds.conf=[path_to_maven]\bin. \bin\m2.conf -Dmaven.home=[path_to_maven]multiModuleProjectDirectory = path_to_myproject -Dfile。utf - 8编码= -Djansi。力= true -Djansi。passthrough=true -classpath [path_to_maven]\boot\plexus-classworlds-2.6.0.jar org.codehaus.plexus.classworlds.launcher.Launcher clean install -B

. exe

注意,这两个命令都有-B(批处理模式,应该关闭着色),唯一的区别是

-Djansi.force=true -Djansi.passthrough=true

现在我只需要能够传递这些“JVM args"The &;mvn.cmd"让这一切变得更好。

我猜大概是这样的:有没有办法通过命令行传递jvm参数给maven?


一点背景知识:

自从最新版本的maven(3。x +)。 我已经尝试了这里的许多解决方案,有时幸运,有时不

这篇来自官方文档的文章一直都是无用的:https://maven.apache.org/surefire/maven-surefire-plugin/examples/class-loading.html

但有一些常数,当我处理这个问题时

  • 总是在窗口,本地
  • 总是有大量的控制台输出。
  • 并不是所有的团队开发人员都会在特定项目中犯错误
  • Jenkins的构建会通过
  • IT测试中的大量控制台输出(故障安全集成测试)

关键的发现是,我注意到在Eclipse中(有或没有嵌入式maven版本),完整的maven构建(干净安装)都可以工作。

因此,我找出了Eclipse使用的命令(感谢:如何获取Eclipse运行配置的命令行?)

从那里,我可以确定解是什么。

看看人们说的其他答案

  • 输出到日志文件
  • 降低日志级别
  • https://stackoverflow.com/a/52033799/1634131 < a href = " https://stackoverflow.com/a/52033799/1634131 " > < / >
  • https://stackoverflow.com/a/64132709/1634131 < a href = " https://stackoverflow.com/a/64132709/1634131 " > < / >

这里显然有一个bug。或者在Maven中,或者在windows控制台中,或者在Jansi库中,或者在这些组件的集成中。

< p >简单的解决方案: 你应该添加src /测试/资源/ logback.xml

<configuration debug="false">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%date{HH:mm:ss.SSS} %highlight(%-5level)
%gray(%logger{90}) %X{X-ApplicationId} %msg%n
</pattern>
</encoder>
</appender>

我最近在JHipster 6.10.5使用spring-boot 2.2.7生成的应用程序中遇到了同样的问题。RELEASE和maven surefire插件3.0.0-M4。这是由于非常长的测试日志造成的超时。通过在pom.xml中的maven-surefire-plugin(在pluginManagement下)中添加以下配置参数来解决:

& lt; forkedProcessExitTimeoutInSeconds> 1200 & lt; / forkedProcessExitTimeoutInSeconds>

看到https://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html#forkedProcessExitTimeoutInSeconds

我的设想是

  • 我的测试有很多日志输出(我的意思是很多 !)
  • Surefire插件v2.22.2
  • 错误只发生在IDE内部,而不是从命令行执行mvn命令。
  • 没有迹象表明任何来自Surefire插件的.dump文件或来自Java二进制的传统hs_err崩溃文件。

对我来说,有两件事一直是解决方案(它们是替代方案):

  1. 不要使用fork:设置Surefire插件属性forkcount = 0
  2. 增加Surefire插件属性 forkedProcessExitTimeoutInSeconds从30秒变成300秒。插件文档表示如果这个超时被击中,你会看到错误消息There was a timeout in the fork。我没有看到这样的错误消息,但它始终解决了这个问题,增加了这个超时值

您可能希望使用解决方案(2),因为分叉是可取的。

为什么?

我的理论是,如果有大量的日志输出,那么在fork关闭时仍然需要进行大量的处理(特别是如果您在一个IDE中运行,该IDE捕获输出并可能为其窗口内容使用内存映射文件)。简而言之:在测试完成时,仍有大量文本等待转发到IDE中。30岁似乎还不够。

这也解释了为什么有些开发者能够发现问题,而有些开发者却不能。在测试结束时,剩下多少输出处理可能是cpu功率、磁盘速度等的函数。

如果我在这一点上是正确的-不能证明它-那么所有的建议,如重定向日志输出和降低日志级别都是IMO处理症状,而不是原因。

发生在我身上的事情:如果你的项目依赖于docker机器或/和数据库来成功构建,那么请首先检查你的db实例是否启动,你的docker也启动,因为可能有一些单元测试在后台运行…特别是在启动笔记本电脑后。希望这能帮助到一些人

您可以使用以下命令。因为你的单元测试需要分叉。关于你在单元测试中使用线程的问题。

mvn test -DforkCount=2

我希望。它有帮助。

我的解决方案是从90 to 120.更改Jenkinsfile中提到的超时

pipeline {
agent { label projectName }


options {
disableConcurrentBuilds()
buildDiscarder(logRotator(numToKeepStr:'5'))
timeout(time: 90, unit: 'MINUTES')
}
< p >谢谢, SA < / p >

这对我很管用。

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M5</version>
<configuration>
<argLine>-Dfile.encoding=UTF-8</argLine>
</configuration>
</plugin>

对我有效的解决方案,设置:<forkCount>0</forkCount>

即。

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<forkCount>0</forkCount>
<argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
</configuration>
</plugin>

在将Maven从2.6.3更新到2.8.4之后,我遇到了同样的问题。问题是分叉JVM崩溃的内存不足,所以只是增加内存从1024Mb到2048Mb在Surefire插件配置,这解决了这个问题

        <plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<!--suppress UnresolvedMavenProperty -->
<argLine>${argLine} -Dfile.encoding=UTF-8 -Xmx2048m</argLine>
</configuration>
</plugin>

在调试模式下运行了几十次Maven之后,我遇到了这样的情况:

-Dmaven.surefire.debug="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005"

由于某些原因,我不得不杀死仍在并行运行的额外java进程。

我忘记在我的Java 7项目的pom.xml中声明maven-surefire,所以它在maven的运行时默认使用Java 8版本。(我以为是在父母那里宣布的)

在pom的构建部分添加surefire解决了这个问题。

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12</version>
<configuration>
<argLine>-XX:-UseSplitVerifier</argLine>
<skip>${maven.skip}</skip>
<skipTests>${maven.skipTests}</skipTests>
</configuration>
</plugin>
</plugins>
</build>
我尝试了这里描述的许多解决方案。没有人能解决这个问题。 最终,唯一有帮助的是maven本身从v3.6.1升级到v3.8.6。(我使用corretto jdk11.0.12_7构建)

如果你正在运行声纳构建清洁验证声纳:声纳和一些文件,产生大量的日志,这些日志发出这个虚拟机终止。

要解决此问题,您可以执行以下步骤。

  1. 在测试资源中添加logback-test.xml

  2. 修改日志级别为INFO模式。

  3. 在maven-surefire-plugin添加以下配置。

    <configuration>
    <reuseForks>false</reuseForks>
    <forkCount>1</forkCount>
    </configuration>
    

现在将生成INFO日志,虚拟机不会崩溃。