test surefirereportparameters pom plugin org compiler java maven maven-surefire-plugin

java - surefirereportparameters - Estrategia para la depuración de errores de seguridad "La máquina virtual bifurcada terminó sin decir adiós correctamente. Fallo de VM o System.exit llamado?



org apache maven plugin surefire surefirereportparameters jar (9)

Estoy trabajando en un proyecto Java bastante complejo con muchas dependencias y muchas pruebas unitarias.

Estoy usando java 1.6.0_65 en mac (mavericks) con maven 3.0.5 con maven-surefire-plugin: 2.16 ejecutándose en varias bifurcaciones. Mi problema es que la ejecución de esta configuración con varias bifurcaciones hace que una bifurcación se cierre con:

"La máquina virtual bifurcada terminó sin decir adiós correctamente. ¿Se produjo un error en la máquina virtual o se llama System.exit?"

ejecutar esto con solo una bifurcación no produce el problema (y todo pasa)

Hay algo de información sobre este problema que incluye esta pregunta de StackOverflow y este error seguro (que parece estar solucionado por ahora)

Soy consciente de que la "Respuesta" a esta situación es encontrar lo que en mi código llama System.exit () - Nada que pueda encontrar.

O lo que hace que mi JVM se bloquee: no hay informes de fallos de hs_pid.

Mi pregunta es: ¿qué tipo de estrategia puedo usar para encontrar una causa? Para aclarar, no estoy interesado en la respuesta mencionada anteriormente, sino en una forma de encontrar de dónde proviene. (O incluso mejor una respuesta completamente diferente a lo que podría estar causando esto)

mi configuración de Surefire es: (pero probé otras combinaciones)

<parallel>classes</parallel> <threadCount>1</threadCount> <forkCount>1C</forkCount> <reuseForks>false</reuseForks> <useSystemClassLoader>false</useSystemClassLoader> <useManifestOnlyJar>true</useManifestOnlyJar> <useFile>true</useFile> <redirectTestOutputToFile>true</redirectTestOutputToFile> <runOrder>alphabetical</runOrder>

Actualización # 1 que agrega la salida relevante después de ejecutar el objetivo de Maven con --debug (-X)

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.16:test (default-test) on project event-logger: ExecutionException; nested exception is java.util.concurrent.ExecutionException: java.lang.RuntimeException: The forked VM terminated without saying properly goodbye. VM crash or System.exit called ? [ERROR] Command was/bin/sh -c cd /Users/nitzan/work/nitzan_5_parallel_tests/event-logger && /Library/Java/JavaVirtualMachines/1.6.0_65-b14-462.jdk/Contents/Home/bin/java org.apache.maven.surefire.booter.ForkedBooter /Users/nitzan/work/nitzan_5_parallel_tests/event-logger/target/surefire/surefire5107531798951225850tmp /Users/nitzan/work/nitzan_5_parallel_tests/event-logger/target/surefire/surefire_12561116468761732560tmp [ERROR] -> [Help 1] org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.16:test (default-test) on project event-logger: ExecutionException; nested exception is java.util.concurrent.ExecutionException: java.lang.RuntimeException: The forked VM terminated without saying properly goodbye. VM crash or System.exit called ? Command was/bin/sh -c cd /Users/nitzan/work/nitzan_5_parallel_tests/event-logger && /Library/Java/JavaVirtualMachines/1.6.0_65-b14-462.jdk/Contents/Home/bin/java org.apache.maven.surefire.booter.ForkedBooter /Users/nitzan/work/nitzan_5_parallel_tests/event-logger/target/surefire/surefire5107531798951225850tmp /Users/nitzan/work/nitzan_5_parallel_tests/event-logger/target/surefire/surefire_12561116468761732560tmp at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:213) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59) at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320) at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156) at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537) at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196) at org.apache.maven.cli.MavenCli.main(MavenCli.java:141) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290) at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409) at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352) at org.codehaus.classworlds.Launcher.main(Launcher.java:47) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) Caused by: org.apache.maven.plugin.MojoFailureException: ExecutionException; nested exception is java.util.concurrent.ExecutionException: java.lang.RuntimeException: The forked VM terminated without saying properly goodbye. VM crash or System.exit called ? Command was/bin/sh -c cd /Users/nitzan/work/nitzan_5_parallel_tests/event-logger && /Library/Java/JavaVirtualMachines/1.6.0_65-b14-462.jdk/Contents/Home/bin/java org.apache.maven.surefire.booter.ForkedBooter /Users/nitzan/work/nitzan_5_parallel_tests/event-logger/target/surefire/surefire5107531798951225850tmp /Users/nitzan/work/nitzan_5_parallel_tests/event-logger/target/surefire/surefire_12561116468761732560tmp at org.apache.maven.plugin.surefire.SurefirePlugin.assertNoException(SurefirePlugin.java:198) at org.apache.maven.plugin.surefire.SurefirePlugin.handleSummary(SurefirePlugin.java:188) at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:852) at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:720) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209) ... 25 more Caused by: org.apache.maven.surefire.booter.SurefireBooterForkException: ExecutionException; nested exception is java.util.concurrent.ExecutionException: java.lang.RuntimeException: The forked VM terminated without saying properly goodbye. VM crash or System.exit called ? Command was/bin/sh -c cd /Users/nitzan/work/nitzan_5_parallel_tests/event-logger && /Library/Java/JavaVirtualMachines/1.6.0_65-b14-462.jdk/Contents/Home/bin/java org.apache.maven.surefire.booter.ForkedBooter /Users/nitzan/work/nitzan_5_parallel_tests/event-logger/target/surefire/surefire5107531798951225850tmp /Users/nitzan/work/nitzan_5_parallel_tests/event-logger/target/surefire/surefire_12561116468761732560tmp at org.apache.maven.plugin.surefire.booterclient.ForkStarter.runSuitesForkPerTestSet(ForkStarter.java:316) at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:169) at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:958) at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:822) ... 28 more Caused by: java.util.concurrent.ExecutionException: java.lang.RuntimeException: The forked VM terminated without saying properly goodbye. VM crash or System.exit called ? Command was/bin/sh -c cd /Users/nitzan/work/nitzan_5_parallel_tests/event-logger && /Library/Java/JavaVirtualMachines/1.6.0_65-b14-462.jdk/Contents/Home/bin/java org.apache.maven.surefire.booter.ForkedBooter /Users/nitzan/work/nitzan_5_parallel_tests/event-logger/target/surefire/surefire5107531798951225850tmp /Users/nitzan/work/nitzan_5_parallel_tests/event-logger/target/surefire/surefire_12561116468761732560tmp at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222) at java.util.concurrent.FutureTask.get(FutureTask.java:83) at org.apache.maven.plugin.surefire.booterclient.ForkStarter.runSuitesForkPerTestSet(ForkStarter.java:300) ... 31 more Caused by: java.lang.RuntimeException: The forked VM terminated without saying properly goodbye. VM crash or System.exit called ? Command was/bin/sh -c cd /Users/nitzan/work/nitzan_5_parallel_tests/event-logger && /Library/Java/JavaVirtualMachines/1.6.0_65-b14-462.jdk/Contents/Home/bin/java org.apache.maven.surefire.booter.ForkedBooter /Users/nitzan/work/nitzan_5_parallel_tests/event-logger/target/surefire/surefire5107531798951225850tmp /Users/nitzan/work/nitzan_5_parallel_tests/event-logger/target/surefire/surefire_12561116468761732560tmp at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:485) at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:352) at org.apache.maven.plugin.surefire.booterclient.ForkStarter.access$300(ForkStarter.java:85) at org.apache.maven.plugin.surefire.booterclient.ForkStarter$2.call(ForkStarter.java:288) at org.apache.maven.plugin.surefire.booterclient.ForkStarter$2.call(ForkStarter.java:283) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) at java.lang.Thread.run(Thread.java:695) [ERROR] [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/MojoFailureException


Acabo de eliminar todo el repositorio de maven y ejecutar maven clean install. Entonces el problema se ha ido.


Cambiar la configuración del complemento debería resolver el problema:

<project> [...] <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.0.0-M1</version> <configuration> <useSystemClassLoader>false</useSystemClassLoader> </configuration> </plugin> </plugins> </build> [...] </project>

Como se sugiere en este post y en la documentation principal del complemento.


Escribiendo aquí la estrategia que utilicé para ayudar a otros que están atrapados con este problema.

Es posible aprovechar el SecurityManager para lanzar una excepción cuando se llama a System.exit (). luego puede examinar la traza de la pila para ver exactamente quién llamó a exit (). Esto es especialmente útil si la llamada para salir se realizó desde un código oculto dentro de uno de los frascos de los que depende y no desde su propio código.

private static void forbidSystemExitCall() { final SecurityManager securityManager = new SecurityManager() { public void checkPermission( Permission permission ) { if( permission.getName().startsWith("exitVM") ) { throw new RuntimeException("Something called exit ") ; } } } ; System.setSecurityManager( securityManager ) ; }


FWIW, he experimentado este error cuando la JVM se quedó sin memoria durante la compilación de Maven. En linux esto fue detectado por OOM killer, que terminó generando mensajes del kernel como el Aug 28 20:53:27 ip-xxx-xxx-xxx-xxx kernel: [248686.775455] java invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0 .

Supongo que en un Mac solo querría monitorear el uso de su memoria con ActivityMonitor.


Lo que puede querer verificar es la configuración de argline para surefire o failafe en la configuración de build / pluging / plugin en su pom. Tuve algo inapropiado allí que causó que la vm bifurcada fallara (Irónicamente, puse maven.failsafe.debug allí para ayudar a depurar una caída anterior del forking).


Opciones de JVM que pueden ayudar:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=c:/dumps/

Nota: Puedes usar barras diagonales.
Nota 2: asegúrese de que la carpeta exista y que el proceso tenga permiso de escritura. En sistemas Windows recientes, C:/ está protegido contra escritura.
Nota 3: asegúrese de tener suficiente espacio libre para escribir el volcado. La documentación de Java 9 menciona que la carpeta temporal del sistema se usará cuando el disco esté lleno.

Si no hay un archivo de volcado, entonces la JVM no se quedó sin memoria.

La siguiente opción es -XX:ErrorFile= que permite a la JVM registrar errores fatales.

-XX:+ShowMessageBoxOnError muestra un cuadro de diálogo de error si la JVM se bloquea.

Nota: Puede cambiar las banderas de una JVM en ejecución usando el comando jinfo .

Pase estas opciones a Maven Surefire a través de la opción argLine :

<build> <plugins> <plugin> <artifactId>maven-surefire-plugin</artifactId> <configuration> <!-- -XX:HeapDumpPath=C:/ -XX:+ShowMessageBoxOnError --> <argLine>@{argLine} -XX:+HeapDumpOnOutOfMemoryError -Xmx1g -XX:HeapDumpPath=H:/dumps/ -XX:ErrorFile=H:/dumps/ -XX:+ShowMessageBoxOnError</argLine> </configuration> </plugin> </plugins> </build>

El extraño @{argLine} al principio permite que otros complementos como Jacoco inyecten sus opciones. Para que esto funcione, necesita agregar una propiedad vacía:

<properties> <argLine></argLine> <!-- Fallback when Jacoco isn''t active. --> </properties>

Puede verificar que funciona cuando se produce el error: Maven luego volcará toda la línea de comando utilizada para iniciar la JVM bifurcada.


Pasos:

(1) Ejecute mvn con las opciones -e y -X para obtener más información de depuración.

(2) Busque "Error" en la salida. En mi caso, cuando ejecuté el comando mvn, parte de la salida incluía:

[ERROR] Command wascmd.exe /X /C "C:/dev/dev-tools/.....

(3) Ejecute el comando problemático directamente en el comando shell.

En mi caso, ejecutando.

cmd.exe /X /C "C:/dev/dev-tools/....

desde la línea de comandos resultó en un OutOfMemoryError.


Si alguien incluye un argumento argLine personalizado, debe reconsiderarlo porque es probable que sea el origen de sus problemas con la asignación de memoria.

Por ejemplo (solía tener):

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

Ahora uso valores duros especificados:

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

Por la razón que sea, las aplicaciones que se integran con Surefire, como Jacoco, no solicitan suficiente memoria para coexistir con las pruebas que se realizan en el momento de la compilación.

(Más información también se puede encontrar en esta pregunta tan (1))

(1) - maven jacoco: no genera reporte de cobertura de código


Siguiendo la documentación de Maven Surefire, puede ejecutar la máquina virtual bifurcada en modo de depuración , si siempre falla. A continuación, puede depurar su código hasta que salga.