10

我有一个 Maven 项目,我想使用 Cargo-Maven-Plugin (1.1.1) 来启动和停止 tomcat 服务器以运行集成测试。

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

服务器的启动工作正常,但停止总是失败。

[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

我已经用几个项目对其进行了测试,至少添加了一个空项目(注意除了 web.xml),但结果始终相同。我测试的是 tomcat6、tomcat7 甚至嵌入式 Jetty6 和 7,但总是同样的例外。我在启动和停止之间添加了 5 秒的延迟(通过集成测试),但这无济于事。

当我查看日志文件和正在运行的进程时,似乎 tomcat 已停止,但 cargo 并没有注意到它。

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

所以我的问题是:

  • 我有什么问题吗?
  • 它是一个错误吗?
  • 有没有变通办法?
4

2 回答 2

6

可能是其他东西正在您机器上的端口 8080 上侦听。这会让cargo认为tomcat没有停下来。您可以通过货物配置将 tomcat 的 AJP 端口更改为不太常见的端口。有关更多详细信息,请参阅此博客文章:http: //kreskasnotes.blogspot.com/2011/07/problem-with-shutting-down-tomcat-via.html

于 2011-07-04T17:17:37.660 回答
6

我有同样的问题。我无法从我的 Hudson 服务器停止容器,而它在我的本地机器上正确停止,具有相同的 pom.xml 和相同的 Maven 目标和选项。

问题是 Hudson 在 Tomcat 上,容器和 Tomcat 使用相同的端口。将 servlet 端口从 8080 更改为 8181,将 AJP 端口从 8009 更改为 8012(数字是任意选择的)解决了问题,并且成功执行了“停止”目标。

我不得不更改 2 个端口,因为冲突发生在 2 个 Tomcat 之间,如果冲突发生在 Tomcat 和其他东西之间,则可能需要 2 个更改之一。

我用来更改端口的 2 行是:

<configuration>
     ...
     <properties>
        ...
        <cargo.servlet.port>8181</cargo.servlet.port>
        <cargo.tomcat.ajp.port>8012</cargo.tomcat.ajp.port>
        ...
    </properties>
    ...
</configuration>
于 2011-07-12T15:37:31.570 回答