2013-04-03 123 views
6

我试图用tomcat7-maven-plugin设置嵌入式Tomcat容器,在pre-integration-test阶段运行web应用,运行集成测试,然后关闭Tomcat的在post-integration-test阶段。该项目是一个多模块maven项目(包含app1,app2等)。家长pom.xml看起来像以下,tomcat7 - Maven的插件:运行多个web应用,但8080端口已在使用

<build> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.tomcat.maven</groupId> 
     <artifactId>tomcat7-maven-plugin</artifactId> 
     <version>2.1</version> 
     <configuration> 
     <contextFile>path/to/context.xml</contextFile> 
     <tomcatUsers>path/to/tomcat-users.xml</tomcatUsers> 
     <fork>true</fork> 
     </configuration> 
     <executions> 
     <execution> 
      <id>tomcat-run</id> 
      <goals> 
      <goal>run</goal> 
      </goals> 
      <phase>pre-integration-test</phase> 
     </execution> 
     <execution> 
      <id>tomcat-shutdown</id> 
      <goals> 
      <goal>shutdown</goal> 
      </goals> 
      <phase>post-integration-test</phase> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 

然后我就跑mvn clean integration-test --projects=app1,app2当第二应用程序正在启动,我得到java.net.BindException

SEVERE: Failed to initialize end point associated with ProtocolHandler ["http-bio-8080"] 
java.net.BindException: Address already in use <null>:8080 
    at org.apache.tomcat.util.net.JIoEndpoint.bind(JIoEndpoint.java:406) 
    at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:610) 
    at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:429) 
    at org.apache.coyote.http11.AbstractHttp11JsseProtocol.init(AbstractHttp11JsseProtocol.java:119) 
    at org.apache.catalina.connector.Connector.initInternal(Connector.java:981) 
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102) 
    at org.apache.catalina.core.StandardService.initInternal(StandardService.java:559) 
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102) 
    at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:814) 
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:139) 
    at org.apache.catalina.startup.Tomcat.start(Tomcat.java:335) 
    at org.apache.tomcat.maven.plugin.tomcat7.run.AbstractRunMojo.startContainer(AbstractRunMojo.java:1091) 
    at org.apache.tomcat.maven.plugin.tomcat7.run.AbstractRunMojo.execute(AbstractRunMojo.java:512) 
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209) 
    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: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) 
Caused by: java.net.BindException: Address already in use 
    at java.net.PlainSocketImpl.socketBind(Native Method) 
    at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:383) 
    at java.net.ServerSocket.bind(ServerSocket.java:328) 
    at java.net.ServerSocket.<init>(ServerSocket.java:194) 
    at java.net.ServerSocket.<init>(ServerSocket.java:150) 
    at org.apache.tomcat.util.net.DefaultServerSocketFactory.createSocket(DefaultServerSocketFactory.java:49) 
    at org.apache.tomcat.util.net.JIoEndpoint.bind(JIoEndpoint.java:393) 
    ... 34 more 

那么,有没有在tomcat7-maven-plugin配置到一个嵌入式的Tomcat运行多个web应用?

+1

你确定8080端口不是之前绑定?我建议使用netstat来确保它。可以运行单个应用程序吗? – Michael 2013-04-04 03:43:57

+0

如果你在Linux上,这会给你的进程ID占用端口:sudo netstat -tulpn | grep 。 – linski 2013-04-04 07:57:16

+0

@Michael是端口8080没有绑定。单个应用开始正常。我认为问题在于'app1'在嵌入式tomcat中启动正常,并且端口为8080.然后'app2'尝试在另一个嵌入式tomcat中启动。可能这就是'tomcat7:run'的工作原理。如果我使用'tomcat7:run-war',插件会运行'app1'和'app2'的战争? – zihaoyu 2013-04-04 16:55:08

回答

14

tomcat7:run魔力参数:您可以配置插件执行使用其他端口,类似这样的配置的东西:

<execution> 
    <id>tomcat-run</id> 
    <goals> 
     <goal>run</goal> 
    </goals> 
    <phase>pre-integration-test</phase> 
    <configuration> 
     <port>9090</port> 
    </configuration> 
</execution> 

,当然还有使用另一个端口的第二个项目。

+0

你的意思是指定父'pom.xml'中的'port'配置吗?我如何用多个模块做到这一点? – zihaoyu 2013-04-04 16:57:08

+0

我的意思是在每个模块(而不是父)中指定一个特定的端口。您可以在父级中保留相同的配置,只需将特定的配置添加到模块中即可。 – Tome 2013-04-05 12:47:16

相关问题