2013-04-03 10 views
6

Sto cercando di utilizzare tomcat7-maven-plugin per configurare un contenitore incorporato gatto, webapps gestite in fase di pre-integration-test, test di integrazione correre, poi l'arresto Tomcat in post-integration-test fase. Il progetto è un progetto multi-modulo maven (contiene app1, app2, ecc.). Parent pom.xml si presenta come segue,tomcat7-maven-plugin: eseguire più webapps ma porta 8080 già in uso

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

Poi ho solo eseguito mvn clean integration-test --projects=app1,app2. Quando la seconda applicazione sta iniziando, ottengo 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 

Così, c'è una configurazione in tomcat7-maven-plugin eseguire più webapps in un Tomcat incorporato?

+1

Sei sicuro che il porta 8080 non era rilegata prima? Suggerisco di assicurarmi che usi netstat. È possibile eseguire la singola applicazione? – Michael

+0

se sei su linux questo ti darà l'ID di processo che occupa la porta : sudo netstat -tulpn | grep . – linski

+0

@ Michael La porta 8080 non è stata rilegata. La singola app è iniziata bene. Il problema è che 'app1' ha iniziato bene in un tomcat incorporato e ha preso la porta 8080. Quindi' app2' ha provato ad avviarsi in un altro tomcat incorporato. Probabilmente questo è il modo in cui 'tomcat7: run' funziona. Se uso 'tomcat7: run-war', il plugin eseguirà le guerre di' app1' e 'app2' complessivamente? – zihaoyu

risposta

14

Vedi tomcat7:run parametri mojo: è possibile configurare le esecuzioni di plugin per utilizzare altre porte, con qualcosa di simile a questa configurazione:

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

E, naturalmente, utilizzare un'altra porta per il secondo progetto.

+0

Intendevi specificare la 'porta' config in parent' pom.xml'? Come faccio a farlo con più moduli? – zihaoyu

+0

Intendo specificare in ogni modulo (non il genitore) una porta specifica. È possibile mantenere la stessa configurazione nel genitore e aggiungere semplicemente la configurazione specifica ai moduli. – Tome

Problemi correlati