2011-06-24 20 views
10

Tengo un proyecto maven en el que quiero utilizar Cargo-Maven-Plugin (1.1.1) para iniciar y detener un servidor tomcat para ejecutar pruebas de integración.Maven Cargo no detiene el contenedor

<plugin> 
<groupId>org.codehaus.cargo</groupId> 
<artifactId>cargo-maven2-plugin</artifactId> 
<version>1.1.1</version> 
<executions> 
    <execution> 
     <id>start-container</id> 
     <phase>pre-integration-test</phase> 
     <goals> 
      <goal>start</goal> 
     </goals> 
    </execution> 
    <execution> 
     <id>stop-container</id> 
     <phase>post-integration-test</phase> 
     <goals> 
      <goal>stop</goal> 
     </goals> 
    </execution> 
</executions> 
<configuration>     
    <container>     
    <type>installed</type> 
    <containerId>tomcat6x</containerId> 
    <zipUrlInstaller> 
     <url>http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.32/bin/apache-tomcat-6.0.32.zip</url> 
    </zipUrlInstaller> 
</container>  
</configuration> 
</plugin> 

de inicio del servidor trabaja muy bien, pero frenado se falló.

[ERROR] Failed to execute goal org.codehaus.cargo:cargo-maven2-plugin:1.1.1:stop (stop-container) on project test: Execution stop-container of goal org.codehaus.cargo:cargo-maven2-plugin:1.1.1:stop failed: Failed to stop the Tomcat 6.x container. Server port 8080 did not shutdown within the timeout period [120000] -> [Help 1] 
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.codehaus.cargo:cargo-maven2-plugin:1.1.1:stop (stop-container) on project test: Execution stop-container of goal org.codehaus.cargo:cargo-maven2-plugin:1.1.1:stop failed: Failed to stop the Tomcat 6.x container. 
     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:225) 
     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:319) 
     at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156) 
     at org.apache.maven.cli.MavenCli.execute(MavenCli.java:534) 
     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) 
Caused by: org.apache.maven.plugin.PluginExecutionException: Execution stop-container of goal org.codehaus.cargo:cargo-maven2-plugin:1.1.1:stop failed: Failed to stop the Tomcat 6.x container. 
     at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:116) 
     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209) 
     ... 19 more 
Caused by: org.codehaus.cargo.container.ContainerException: Failed to stop the Tomcat 6.x container. 
     at org.codehaus.cargo.container.spi.AbstractLocalContainer.stop(AbstractLocalContainer.java:220) 
     at org.codehaus.cargo.maven2.ContainerStopMojo.doExecute(ContainerStopMojo.java:49) 
     at org.codehaus.cargo.maven2.AbstractCargoMojo.execute(AbstractCargoMojo.java:278) 
     at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:107) 
     ... 20 more 
Caused by: org.codehaus.cargo.container.ContainerException: Server port 8080 did not shutdown within the timeout period [120000] 
     at org.codehaus.cargo.container.spi.AbstractLocalContainer.waitForPortShutdown(AbstractLocalContainer.java:363) 
     at org.codehaus.cargo.container.spi.AbstractLocalContainer.waitForPortShutdown(AbstractLocalContainer.java:297) 
     at org.codehaus.cargo.container.tomcat.internal.AbstractCatalinaInstalledLocalContainer.waitForCompletion(AbstractCatalinaInstalledLocalContainer.java:190) 
     at org.codehaus.cargo.container.spi.AbstractLocalContainer.stop(AbstractLocalContainer.java:214) 
     ... 23 more 

he probado con varios proyectos, añadir al menos con un proyecto vacío (donde se observa una excepción web.xml) pero siempre el mismo resultado. Probé con tomcat6, tomcat7 e incluso con Jetty6 y 7 incrustados, pero siempre con la misma excepción. He agregado un retraso de 5 segundos entre el inicio y el final (a través de una prueba de integración), pero esto no ayuda.

Cuando echo un vistazo a los archivos de registro y los procesos en ejecución, parece que el tomcat está detenido, pero la carga no lo notó.

24.06.2011 17:38:07 org.apache.catalina.startup.Catalina start 
INFO: Server startup in 694 ms 
24.06.2011 17:38:07 org.apache.coyote.http11.Http11Protocol pause 
INFO: Pausing Coyote HTTP/1.1 on http-8080 
24.06.2011 17:38:08 org.apache.catalina.core.StandardService stop 
INFO: Stopping service Catalina 
24.06.2011 17:38:08 org.apache.coyote.http11.Http11Protocol destroy 
INFO: Stopping Coyote HTTP/1.1 on http-8080 

Así que mi pregunta es:

  • ¿Tengo algo mal?
  • ¿Es un error?
  • ¿Hay alguna solución alternativa?
+0

encontrado esto hace poco, casi exactamente la misma configuración, exactamente el mismo problema. Estoy interesado en escuchar la solución: teníamos, por otras razones, la necesidad de dividir las fases de la compilación en múltiples compilaciones distribuidas, así que movimos las acciones de inicio/detención de tomcat a Ant, que funcionó (todo orquestado a través de Hudson/Jenkins). El problema que descubrimos es cómo la compilación genera la JVM de tomcat, y cómo el servidor de compilación/CI mataría los procesos hijo si no procesara la bandera de spawn. ¿Quizás una opción de Maven que falta en alguna parte? –

+0

@Al Baker: He abierto un error en Cargo Bug Tracker (http://jira.codehaus.org/browse/CARGO-1005). Pero todavía no encontramos la causa del problema. Porque funcionó con otros sistemas. Puede ser útil que agregue un comentario para describir su configuración (y puede verificar si el proyecto de ejemplo que he adjuntado al error funciona para usted o no). – Ralph

+0

Era casi exactamente lo mismo, pero sin el instalador de url - estábamos en una red desconectada –

Respuesta

5

Podría ser que algo más esté escuchando en el puerto 8080 en su máquina. Esto haría que la carga piense que Tomcat no se detuvo. Puede cambiar el puerto AJP para tomcat a través de la configuración de carga a algo menos común. Vea esta publicación en el blog para más detalles: http://kreskasnotes.blogspot.com/2011/07/problem-with-shutting-down-tomcat-via.html

+0

Esto fue una muy buena pista. No sé qué está mal con el puerto 8080 en mi máquina, porque Putty y Netstat no encontraron nada en el puerto 8080. Pero después de cambiar al puerto 8081 funciona. Por cierto: ** No debo cambiar el puerto AJP pero el puerto del servlet: ' 8081' ** – Ralph

+0

Del mismo modo para mí, esto me dio la idea de buscar huérfanos procesos tomcat. Encontré uno, lo maté y el problema desapareció. – HDave

5

Tuve el mismo problema. No pude detener el contenedor desde mi servidor Hudson, mientras se detenía correctamente en mi máquina local con el mismo pom.xml y los mismos objetivos y opciones de Maven.

El problema era que el Hudson estaba en un Tomcat, y el contenedor y el Tomcat usaban los mismos puertos. Cambiar el puerto del servlet de 8080 a 8181, y el puerto AJP de 8009 a 8012 (los números se habían elegido arbitrariamente) resolvió el problema, y ​​el objetivo "detener" se ejecutó con éxito.

Tuve que cambiar los 2 puertos porque el conflicto era entre 2 Tomcats, si el conflicto es entre un Tomcat y algo más, solo uno de los 2 cambios podría ser necesario.

Las 2 líneas que utiliza para cambiar los puertos son:

<configuration> 
    ... 
    <properties> 
     ... 
     <cargo.servlet.port>8181</cargo.servlet.port> 
     <cargo.tomcat.ajp.port>8012</cargo.tomcat.ajp.port> 
     ... 
    </properties> 
    ... 
</configuration> 
Cuestiones relacionadas