Maven Cargo does not stop the container
Asked Answered
I

2

12

I have a maven project where I want to use the Cargo-Maven-Plugin (1.1.1) to start and stop a tomcat server to run integration tests.

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

Starting of the server works fine, but stopping always failed.

[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

I have tested it with several projects, add at least with an empty project (noting except an web.xml) but always the same result. I tested is with tomcat6, tomcat7 and even with embedded Jetty6 and 7, but always the same exception. I have added a delay of 5 seconds between start and stop (via a integration test), but this does not help.

When I have a look at the log files, and the running processes, it seem that the tomcat is stopped, but cargo did not notice it.

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

So my question is:

  • Do I something wrong?
  • Is it a bug?
  • Is there any workarround?
Impost answered 24/6, 2011 at 14:22 Comment(3)
Encountered this recently, almost exact same setup, exact same problem. I'm interested to hear the solution -- we had, for other reasons, the need to break up the phases of the build across multiple distributed builds - so we moved the tomcat startup/stop actions into Ant, which did work (all orchestrated via Hudson/Jenkins). The one gotcha we did unearth is how the build spawns the tomcat JVM, and how build/CI server would kill child processes if you didn't process the spawn flag in. Perhaps a missing Maven option somewhere?Plication
@Al Baker: I have opened a Bug at Cargo Bug Tracker (jira.codehaus.org/browse/CARGO-1005). But we still not found the cause for the problem. Because it worked with other systems. May it would be helpful I you add a comment to describe your setup (and may verify if the sample project which I have attached to the bug, works for you or not).Impost
It was almost exactly the same, but without the url installer -- we were on a disconnected networkPlication
H
6

It could be that something else is listening on port 8080 on your machine. This would make cargo think that tomcat didn't stop. You can change the AJP port for tomcat via cargo configuration to something less common. See this blog post for more details: http://kreskasnotes.blogspot.com/2011/07/problem-with-shutting-down-tomcat-via.html

Hypallage answered 4/7, 2011 at 17:17 Comment(2)
This was a very good hint. I don't know what is wrong with Port 8080 on my machine, because Putty and Netstat did not find anything on Port 8080. But after changing to Port 8081 it works. BTW: I must not change the AJP port but the servlet port: <cargo.servlet.port>8081</cargo.servlet.port>Impost
Likewise for me, this gave me the idea of looking for orphaned tomcat processes. Found one, killed it, and the issue went away.Processional
A
6

I had the same problem. I couldn't stop the container from my Hudson server, while it was correctly stopping on my local machine with the same pom.xml and the same Maven goals and options.

The problem was that the Hudson was on a Tomcat, and the container and the Tomcat used the same ports. Changing the servlet port from 8080 to 8181, and the AJP port from 8009 to 8012 (numbers had been arbitrarily chosen) solved the problem, and the "stop" goal is successfully executed.

I had to change the 2 ports because the conflict was between 2 Tomcats, if the conflict is between a Tomcat and something else just one of the 2 changes could be necessary.

The 2 lines I used to change the ports are :

<configuration>
     ...
     <properties>
        ...
        <cargo.servlet.port>8181</cargo.servlet.port>
        <cargo.tomcat.ajp.port>8012</cargo.tomcat.ajp.port>
        ...
    </properties>
    ...
</configuration>
Aestival answered 12/7, 2011 at 15:37 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.