web-dev-qa-db-fra.com

Plugin Surefire Maven: "STDOUT corrompu en écrivant directement dans le flux natif dans la JVM fourchue"

Mes tests JUnit échouent lors de leur exécution via Maven et le plug-in Surefire (informations de version ci-dessous). Je vois le message d'erreur:

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

La page FAQ indique quelques raisons possibles mais je ne vois pas comment utiliser ces informations pour commencer à résoudre ce problème:

STDOUT corrompu en écrivant directement dans le flux natif dans la JVM forkée

Si vos tests utilisent une bibliothèque native qui imprime sur STDOUT, ce message d'avertissement apparaît parce que la bibliothèque a corrompu le canal utilisé par le plugin afin de transmettre les événements avec l'état du test au processus Maven. Ce serait encore pire si vous surchargez le flux Java par System.setOut parce que le flux est également censé être corrompu mais le Maven ne verra jamais les tests terminés et la construction peut se bloquer.

Ce message d'avertissement s'affiche si vous utilisez FileDescriptor.out ou JVM imprime le résumé GC.

Dans ce cas, l'avertissement est imprimé "STDOUT corrompu en écrivant directement dans le flux natif dans la JVM forkée", et un fichier de vidage se trouve dans le répertoire Reports.

Si le niveau de débogage est activé, des messages de flux corrompu apparaissent dans la console.

Il fait référence à une bibliothèque native imprimant directement sur STDOUT, mais comment puis-je déterminer laquelle, et même si je le fais, comment puis-je résoudre ce problème si j'ai besoin de la bibliothèque pour mon projet?

Il mentionne le "niveau de débogage" mais il n'est pas clair si cela signifie le niveau de débogage de Maven ou le niveau de débogage du plugin Surefire. J'ai activé le débogage de Maven mais je ne vois pas les sorties de la console comme mentionné dans la FAQ. Et l'option de débogage de Surefire semble être de suspendre les tests et d'attendre qu'un débogueur soit connecté au processus, et non simplement d'afficher plus d'informations sur la console.

Les fichiers de vidage ne semblent pas non plus très utiles:

# 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)

Alors, comment puis-je résoudre ce problème?

pdate: informations de configuration demandées ci-dessous.

J'utilise OpenJDK 11 (distribution Zulu) sur Windows 10, Maven 3.5.3 et Surefire 2.21.0 (configuration complète ci-dessous).

J'exécute Maven depuis Eclipse en utilisant l'option de menu contextuel "Exécuter en tant que ..." sur le pom.xml, mais obtenez les mêmes résultats lors de son exécution sur la console.

Je n'avais jamais entendu parler de JaCoco avant le premier commentaire de cette question, mais je vois plusieurs messages d'erreur le mentionnant:

[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

Voici la configuration du plugin 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

Les nouvelles versions du plugin Surefire sont complètement boguées et cassées. pour moi (testé jusqu'à Java 12) la seule solution était de s'en tenir à 2.2.

N'utilisez pas non plus la 2.20.1, qui a échoué avec un NPE, même si elle est peut-être spécifique à des tests particuliers, mais je n'ai pas le temps d'enquêter.

0
Werner Keil

Ce qui m'a résolu, c'est la mise à niveau du plugin maven surefire vers 2.22.2

0
jhas