web-dev-qa-db-ja.com

Surefire Mavenプラグイン:「フォークされたJVMのネイティブストリームに直接書き込むことにより、STDOUTが破損しました」

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プロセスに送信するためにライブラリがプラグインによって使用されるチャネルを破損したため、この警告メッセージが表示されます。 JavaストリームをSystem.setOutでオーバーライドすると、ストリームも破損しているはずですが、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ディストリビューション)を使用しています。

pom.xmlファイルの[Run As ...]コンテキストメニューオプションを使用してEclipseから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>
33
user118967

新しいSurefireプラグインバージョンは完全にバグがあり、壊れています。私にとって(Java 12までテスト済み)唯一の解決策は2.2を使用することでした。

NPEで失敗した2.20.1も使用しないでください。特定のテストに固有のものかもしれませんが、調査する時間はありません。

0
Werner Keil

私にとってそれを解決したのは、maven surefireプラグインを2.22.2にアップグレードすることです

0
jhas