我的 JUnit 测试在通过 Maven 和 Surefire 插件(下面的版本信息)运行时失败。我看到了错误消息:
Corrupted STDOUT by directly writing to native stream in forked JVM 4. See FAQ web page and the dump file C:\(...)\target\surefire-reports\2019-03-20T18-57-17_082-jvmRun4.dumpstream
FAQ 页面指出了一些可能的原因,但我不知道如何利用这些信息来开始解决这个问题:
通过直接写入分叉 JVM 中的本机流来损坏 STDOUT
如果您的测试使用的本机库打印到 STDOUT,这个警告消息会出现,因为该库损坏了插件使用的通道,以便将具有测试状态的事件传输回 Maven 进程。如果您通过 System.setOut 覆盖 Java 流,情况会更糟,因为流也应该被破坏,但 Maven 将永远不会看到测试完成,构建可能会挂起。
如果使用 FileDescriptor.out 或 JVM 打印 GC 摘要,则会出现此警告消息。
在这种情况下,警告打印为“通过直接写入分叉 JVM 中的本机流损坏的 STDOUT”,并且可以在 Reports 目录中找到转储文件。
如果启用了调试级别,则控制台中将显示已损坏流的消息。
它指的是一些直接打印到 STDOUT 的本地库,但是如何才能找出是哪一个,即使我这样做了,如果我的项目需要这个库,我该如何处理这个问题?
它提到了“调试级别”,但不清楚这是指 Maven 的调试级别还是 Surefire 插件的调试级别。我启用了 Maven 的调试,但是我没有看到 FAQ 中提到的控制台输出。而且 Surefire 的调试选项似乎是关于暂停测试并等待调试器连接到进程,而不是简单地在控制台上显示更多信息。
转储文件似乎也没有多大帮助:
# Created on 2019-03-20T18:42:58.323
Corrupted STDOUT by directly writing to native stream in forked JVM 2. Stream 'FATAL ERROR in native method: processing of -javaagent failed'.
java.lang.IllegalArgumentException: Stream stdin corrupted. Expected comma after third character in command 'FATAL ERROR in native method: processing of -javaagent failed'.
at org.apache.maven.plugin.surefire.booterclient.output.ForkClient$OperationalData.<init>(ForkClient.java:511)
at org.apache.maven.plugin.surefire.booterclient.output.ForkClient.processLine(ForkClient.java:209)
at org.apache.maven.plugin.surefire.booterclient.output.ForkClient.consumeLine(ForkClient.java:176)
at org.apache.maven.plugin.surefire.booterclient.output.ThreadedStreamConsumer$Pumper.run(ThreadedStreamConsumer.java:88)
at java.base/java.lang.Thread.run(Thread.java:834)
那么,我该如何解决这个问题呢?
更新 : 请求的配置信息如下。
我在 Windows 10、 Maven 3.5.3和 Surefire 2.21.0(下面是完整配置)上使用 OpenJDK 11(Zulu 发行版)。
我在 Eclipse 中使用 pom.xml
文件上的“ Run As...”上下文菜单选项运行 Maven,但是在控制台上运行时获得相同的结果。
在这个问题的第一条注释之前,我从未听说过 JaCoco,但是我看到了几条提到它的错误消息:
[ERROR] ExecutionException The forked VM terminated without properly saying goodbye. VM crash or System.exit called?
[ERROR] Command was cmd.exe /X /C ""C:\Program Files\Zulu\zulu-11\bin\java" -javaagent:C:\\Users\\E26638\\.m2\\repository\\org\\jacoco\\org.jacoco.agent\\0.8.0\\org.jacoco.agent-0.8.0-runtime.jar=destfile=C:\\Users\\E26638\\git\\aic-expresso\\target\\jacoco.exec -Xms256m -Xmx1028m -jar C:\Users\E26638\AppData\Local\Temp\surefire10089630030045878403\surefirebooter8801585361488929382.jar C:\Users\E26638\AppData\Local\Temp\surefire10089630030045878403 2019-03-21T21-26-04_829-jvmRun12 surefire10858509118810158083tmp surefire_115439010304069944813tmp"
[ERROR] Error occurred in starting fork, check output in log
[ERROR] Process Exit Code: 1
这是 Surefire Maven 的插件配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<configuration>
<skipTests>${skipUnitTests}</skipTests>
<testFailureIgnore>false</testFailureIgnore>
<forkCount>1.5C</forkCount>
<reuseForks>true</reuseForks>
<parallel>methods</parallel>
<threadCount>4</threadCount>
<perCoreThreadCount>true</perCoreThreadCount>
<reportFormat>plain</reportFormat>
<trimStackTrace>false</trimStackTrace>
<redirectTestOutputToFile>true</redirectTestOutputToFile>
</configuration>
</plugin>