【问题标题】:Maven Cargo does not stop the containerMaven Cargo 不会停止容器
【发布时间】:2011-09-22 02:06:00
【问题描述】:

我有一个 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

所以我的问题是:

  • 我有什么问题吗?
  • 这是一个错误吗?
  • 有什么解决方法吗?

【问题讨论】:

  • 最近遇到这个,几乎一模一样的设置,一模一样的问题。我很想听听解决方案——由于其他原因,我们需要在多个分布式构建之间分解构建阶段——所以我们将 tomcat 启动/停止操作移到 Ant 中,它确实有效(所有协调通过哈德森/詹金斯)。我们发现的一个问题是构建如何生成 tomcat JVM,以及如果您不处理 spawn 标志,构建/CI 服务器将如何杀死子进程。也许某处缺少 Maven 选项?
  • @Al Baker:我在 Cargo Bug Tracker (jira.codehaus.org/browse/CARGO-1005) 上打开了一个 Bug。但是我们仍然没有找到问题的原因。因为它与其他系统一起工作。如果您添加评论来描述您的设置,可能会有所帮助(并且可以验证我附加到错误的示例项目是否适合您)。
  • 几乎一模一样,但没有 url 安装程序——我们处于断开的网络中

标签: java tomcat maven integration-testing cargo


【解决方案1】:

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

【讨论】:

  • 这是一个很好的提示。我不知道我机器上的 8080 端口出了什么问题,因为 Putty 和 Netstat 在 8080 端口上没有找到任何东西。但是在更改为 8081 端口后它可以工作。顺便说一句:我不能更改 AJP 端口,而是更改 servlet 端口:&lt;cargo.servlet.port&gt;8081&lt;/cargo.servlet.port&gt;
  • 同样对我来说,这给了我寻找孤立的 tomcat 进程的想法。找到一个,杀了它,问题就消失了。
【解决方案2】:

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

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

我不得不更改 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多