2013-04-03 8 views
6

Tôi đang cố gắng sử dụng tomcat7-maven-plugin để thiết lập vùng chứa tomcat được nhúng, chạy ứng dụng web trong giai đoạn pre-integration-test, chạy thử nghiệm tích hợp, sau đó tắt tomcat trong giai đoạn post-integration-test. Dự án là một dự án maven đa mô-đun (chứa app1, app2, v.v ...). Mẹ pom.xml trông giống như sau,tomcat7-maven-plugin: chạy nhiều ứng dụng web nhưng cổng 8080 đã được sử dụng

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

Sau đó, tôi chỉ cần chạy mvn clean integration-test --projects=app1,app2. Khi ứng dụng thứ hai được bắt đầu, tôi nhận được 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 

Vậy là có một cấu hình trong tomcat7-maven-plugin để chạy nhiều ứng dụng web trong một tomcat nhúng?

+1

Bạn có chắc chắn các cổng 8080 đã không binded trước? Tôi đề nghị để đảm bảo nó bằng cách sử dụng netstat. Có thể chạy ứng dụng đơn lẻ không? – Michael

+0

nếu bạn đang sử dụng Linux, điều này sẽ cung cấp cho bạn ID quá trình chiếm cổng : sudo netstat -tulpn | grep . – linski

+0

@Michael Có cổng 8080 không bị ràng buộc. Ứng dụng đơn khởi động tốt. Vấn đề tôi nghĩ là 'app1' bắt đầu tốt trong một tomcat nhúng và lấy cổng 8080. Sau đó,' app2' đã cố gắng để bắt đầu trong một tomcat nhúng khác. Có lẽ đây là cách 'tomcat7: run' hoạt động. Nếu tôi sử dụng 'tomcat7: run-war', plugin sẽ chạy các cuộc chiến tranh của' app1' và 'app2' hoàn toàn? – zihaoyu

Trả lời

14

Xem tomcat7:run thông số mojo: bạn có thể cấu hình hành plugin để sử dụng các cảng khác, với một cái gì đó tương tự như cấu hình này:

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

Và dĩ nhiên sử dụng cổng khác cho dự án thứ hai.

+0

Ý của bạn là xác định cấu hình 'cổng' trong" pom.xml' cha mẹ? Làm cách nào để làm điều này với nhiều mô-đun? – zihaoyu

+0

Tôi có nghĩa là xác định trong mỗi mô-đun (không phải là phụ huynh) một cổng cụ thể. Bạn có thể giữ cùng cấu hình trong phụ huynh và chỉ cần thêm cấu hình cụ thể vào các mô-đun. – Tome