当前位置: 首页 > 面试题库 >

Surefire Maven插件:“通过直接在派生的JVM中写入本机流而损坏了STDOUT”

夹谷成龙
2023-03-14
问题内容

通过Maven和Surefire插件运行它们时,我的JUnit测试失败(下面的版本信息)。我看到错误消息:

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运行Maven pom.xml,但是在控制台上运行它时获得相同的结果。

在对这个问题发表第一条评论之前,我从未听说过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>

问题答案:

在将项目从JAVA 8迁移到JAVA 11时遇到相同的问题,将jacoco-plugin从0.8.1升级到0.8.4即可完成工作。

分析Maven依赖项,查看从何处提取了jacoco,然后修复版本应该可以解决此问题。



 类似资料:
  • 我的JUnit测试在通过Maven和Surefire插件(版本信息如下)运行时失败了。我看到错误消息: 如果使用FileDescriptor.out或JVM打印GC摘要,则会出现此警告消息。 在这种情况下,警告被打印为“通过直接写入分叉JVM中的本机流而损坏STDOUT”,并且可以在Reports目录中找到转储文件。 如果启用了调试级别,则会在控制台中显示损坏流的消息。 那么,我该如何解决这个问题

  • 我的JUnit测试在通过Maven和Surefire插件(版本信息如下)运行时失败了。我看到错误消息: 如果使用FileDescriptor.out或JVM打印GC摘要,则会出现此警告消息。 在这种情况下,警告被打印为“通过直接写入分叉JVM中的本机流而损坏的STDOUT”,并且可以在Reports目录中找到转储文件。 如果启用了调试级别,则控制台中会出现损坏流的消息。 更新:下面请求的配置信息。

  • 使用Java11运行maven构建时,构建在运行测试时发出以下警告: ...之后是构建失败后的以下stderr输出: 也就是说,与大多数在最新版本的插件中解决的问题不同,在surefire和JVM的最新版本中,这个问题似乎再次抬头。 欢迎任何解决方案或工作方法。我正在使用以下版本: Apache Maven 3.5.3(3383C37E1F9E9B3BC3DF5050C29C8AFF9F29529

  • Netty4是否可以直接将写入通道,而不经过处理程序?

  • 问题内容: 此代码 即使我在相当大的程序中使用它(在jvm启动之后),对于许多字段也只报告零。 非零字段是“ ”,“ ”。 所有,,,,均为零。 有东西坏了吗? Linux是x86 2.6.30。 问题答案: 是的,它被部分破坏了。并非所有字段都由内核填充。http://www.kernel.org/doc/man- pages/online/pages/man2/getrusage.2.html

  • 我有一段代码,目前正在写入一个