目标:webapp_aggregator为聚合和父pom工程,不包含代码和资源,webapp为主web工程,webapp_module1为子web工程,webapp_common为基础子工程,两个web工程都依赖该工程。打包后webapp和webapp_module1合并为1个war包webapp.war,并且自动发布到tomcat,支持断点调试。

依赖关系:webapp->webapp_module1; webapp->webapp_common; webapp_module1->webapp_common。

1,eclipse新建maven quickstart工程webapp_aggregator和webapp_common, 新建maven web工程webapp和webapp_module1,每个工程点击properties->java build path, properties->java compiler保证选择了正确的jdk版本(如果是jre版本编译时会出错,需要点击windows->preferences->java->installed jres,改为jdk的目录),点击properties->project facets,选择正确的java版本,如果是web工程,需要选择dynamic web module的版本和runtimes(apache tomcat v8.0)。

2,webapp_aggragator工程pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  
  <modelVersion>4.0.0</modelVersion>
  <name>webapp_aggregator</name>
  <url>http://maven.apache.org</url>

  <groupId>com.xf</groupId>
  <artifactId>webapp_aggregator</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <!-- 该工程为java工程,此工程只是作为聚合和父工程,打包类型为pom,其它子工程继承该工程的pom,包括相关的依赖 -->
  <packaging>pom</packaging>

  <!-- 通过modules标签聚合3个子工程,依赖关系为webapp->webapp_module,这两个工程为web工程,同时这两个工程都依赖webapp_common工程,webapp_common工程为java工程 -->
  <modules>
      <!-- 父工程和子工程在同一个工作空间下,所以用相对路径即可 -->
    <module>../webapp</module>
    <module>../webapp_module1</module>
    <module>../webapp_common</module>
  </modules>

  <properties>
      <!-- 指定工程编译后的编码格式为UTF-8,默认是GBK,所以要指定后才是UTF-8 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  
  <build>
    <plugins>
        <!-- 该插件可解决maven update后jre变为1.5的问题 -->
           <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
  </build>

  <!-- 以下依赖都会被子工程继承 -->
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.1.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts2-json-plugin</artifactId>
        <version>2.3.20</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.3.7.Final</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
        <version>3.0.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http</artifactId>
        <version>3.0.3</version>
    </dependency>
  </dependencies>
</project>

3,webapp工程pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  
  <modelVersion>4.0.0</modelVersion>
  <url>http://maven.apache.org</url>
  <name>webapp Maven Webapp</name>

  <artifactId>webapp</artifactId>
  <!-- web工程打包类型为war -->
  <packaging>war</packaging>
  
  <!-- 继承webapp_aggregator的pom配置 -->
  <parent>
      <groupId>com.xf</groupId>
      <artifactId>webapp_aggregator</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <relativePath>../webapp_aggregator</relativePath>
  </parent>
  
  <build>
      <!-- 打包后target目录下的工程名称 -->
    <finalName>webapp</finalName>
    <plugins>
        <!-- 该插件用于合并多个web工程为一个war,该插件只需要在主工程中配置即可,此处主工程为webapp,子工程为webapp_module1 -->
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <!-- 必须配置此项,否则打包后的web.xml可能是某个子工程的,该配置用于排除打包overlays标签中配置的工程的web.xml,对所有overlays标签中的工程有效 --> 
                <packagingExcludes>WEB-INF/web.xml</packagingExcludes>          
                <overlays>
                    <overlay>
                        <groupId>com.xf</groupId>
                        <artifactId>webapp_module1</artifactId>                        
                    </overlay>
                    <!-- 如果overlay中什么都不写,表示该overlay代表的是当前工程,即当前pom.xml所在的工程webapp,一般情况下不要加入当前工程
                    <overlay>
                    </overlay> 
                    -->
                </overlays>                                  
            </configuration>
        </plugin>
        
        <!-- 该插件用于将工程发布到tomcat,tomcat需要处于运行状态,另外如果是多web工程聚合项目,主工程和所有依赖的子工程都要配置该插件,否则发布的时候会报错 -->
        <!-- 相关的maven发布命令为 tomcat:redeploy 或 tomcat:deploy -->
         <plugin>
             <groupId>org.codehaus.mojo</groupId>
             <artifactId>tomcat-maven-plugin</artifactId>
             <version>1.1</version>
             <configuration>
                 <!-- 此处为固定配置 适用于tomcat8 -->
                 <url>http://localhost:8080/manager/text</url>
                 <!-- 此处的myTomcat对应Apache maven安装目录的conf/setting.xml中的server配置
                       <servers>
                        <server>
                          <id>myTomcat</id>
                          <username>tomcat</username>
                          <password>tomcat</password>
                        </server>
                      </servers>
                      另外要注意,tomcat8 server的tomcat-users.xml中配置的role一定要加上manager-script角色,否则会发布失败,标准写法为
                      <role rolename="manager-gui"/>
                      <role rolename="manager-script"/>
                      <user password="tomcat" roles="manager-gui,manager-script" username="tomcat"/>
                     在eclipse创建的Servers的tomcat-users.xml中更改即可,启动后会自动同步到tomcat安装目录的tomcat-users.xml
                 -->
                <server>myTomcat</server>
                <!-- 配置该项后发布到tomcat webapps目录下的war包为webapp.war,如果不设置会默认生成ROOT.war -->
                <path>/webapp</path>
             </configuration>
         </plugin> 
    </plugins>
  </build>
  
  <!-- 当前项目需要的依赖,注意由于继承了webapp_aggregator工程的pom.xml,所以webapp_aggregator中已有的依赖不需要再重新配置 -->
  <dependencies>
      <dependency>
          <groupId>javax.servlet</groupId>
          <!-- 如果版本是3.1,前面必须加javax前缀 -->
          <artifactId>javax.servlet-api</artifactId>
          <!-- 此处的版本必须小于等于当前工程(webapp)->properties->project facets->dynamic web module->version的版本号,否则编译会报错 -->
          <!-- 如果project facets中的dynamic web module的version无法更改到3.1,那么需要更改几处地方:
              1,当前工程的web.xml的正确标准模板为:
              <?xml version="1.0" encoding="UTF-8"?>
              <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                    http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee">
            </web-app>
            2,依赖jdk为1.7或以上
            3,maven插件最好都为最新版
            4,当前工程.settings/org.eclipse.wst.common.project.facet.core.xml中的jst.web的version更改为3.1 <installed facet="jst.web" version="3.1"/>
            5,运行maven update后即可
          -->
          <version>3.1.0</version>
          <!-- 因为运行时该jar包在tomcat中已经存在,所以不需要打包该jar,用provide scope即可 -->
          <scope>provided</scope>
      </dependency>
      <!-- 依赖webapp_common工程 -->
      <dependency>
          <groupId>com.xf</groupId>
          <artifactId>webapp_common</artifactId>
          <version>0.0.1-SNAPSHOT</version>
      </dependency>
      <!-- 依赖webapp_module1工程,因为要合并到主工程war包中,所以type为war -->
      <dependency>
          <groupId>com.xf</groupId>
          <artifactId>webapp_module1</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <type>war</type>
      </dependency>
  </dependencies>
</project>

4,webapp_module1工程pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  
  <modelVersion>4.0.0</modelVersion>
  <name>webapp_module1 Maven Webapp</name>
  <url>http://maven.apache.org</url>
  
  <artifactId>webapp_module1</artifactId>
  <!-- web工程打包类型为war -->
  <packaging>war</packaging>

  <!-- 继承webapp_aggregator的pom配置 -->  
  <parent>
      <groupId>com.xf</groupId>
      <artifactId>webapp_aggregator</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <relativePath>../webapp_aggregator</relativePath>
  </parent>

  <build>
      <!-- 打包后target目录下的工程名称 -->
    <finalName>webapp_module1</finalName> 
    <plugins>
        <!-- 该插件用于将工程发布到tomcat,tomcat需要处于运行状态,另外如果是多web工程聚合项目,主工程和所有依赖的子工程都要配置该插件,否则发布的时候会报错 -->
        <!-- 相关的maven发布命令为 tomcat:redeploy 或 tomcat:deploy -->
           <plugin>
             <groupId>org.codehaus.mojo</groupId>
             <artifactId>tomcat-maven-plugin</artifactId>
             <version>1.1</version>
             <configuration>
                 <!-- 此处为固定配置 适用于tomcat8 -->
                 <url>http://localhost:8080/manager/text</url>
                 <!-- 此处的myTomcat对应Apache maven安装目录的conf/setting.xml中的server配置
                       <servers>
                        <server>
                          <id>myTomcat</id>
                          <username>tomcat</username>
                          <password>tomcat</password>
                        </server>
                      </servers>
                      另外要注意,tomcat8 server的tomcat-users.xml中配置的role一定要加上manager-script角色,否则会发布失败,标准写法为
                      <role rolename="manager-gui"/>
                      <role rolename="manager-script"/>
                      <user password="tomcat" roles="manager-gui,manager-script" username="tomcat"/>
                     在eclipse创建的Servers的tomcat-users.xml中更改即可,启动后会自动同步到tomcat安装目录的tomcat-users.xml
                 -->
                <server>myTomcat</server>
                <!-- 配置该项后发布到tomcat webapps目录下的war包为webapp.war,如果不设置会默认生成ROOT.war -->
                <path>/webapp</path>
             </configuration>
         </plugin>
    </plugins>
  </build>

  <!-- 当前项目需要的依赖,注意由于继承了webapp_aggregator工程的pom.xml,所以webapp_aggregator中已有的依赖不需要再重新配置 -->  
  <dependencies>
      <dependency>
          <groupId>javax.servlet</groupId>
          <!-- 如果版本是3.1,前面必须加javax前缀 -->
          <artifactId>javax.servlet-api</artifactId>
          <!-- 此处的版本必须小于等于当前工程(webapp)->properties->project facets->dynamic web module->version的版本号,否则编译会报错 -->
          <!-- 如果project facets中的dynamic web module的version无法更改到3.1,那么需要更改几处地方:
              1,当前工程的web.xml的正确标准模板为:
              <?xml version="1.0" encoding="UTF-8"?>
              <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                    http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee">
            </web-app>
            2,依赖jdk为1.7或以上
            3,maven插件最好都为最新版
            4,当前工程.settings/org.eclipse.wst.common.project.facet.core.xml中的jst.web的version更改为3.1 <installed facet="jst.web" version="3.1"/>
            5,运行maven update后即可
          -->
          <version>3.1.0</version>
          <!-- 因为运行时该jar包在tomcat中已经存在,所以不需要打包该jar,用provide scope即可 -->
          <scope>provided</scope>
      </dependency>
      <!-- 依赖webapp_common工程 -->
      <dependency>
          <groupId>com.xf</groupId>
          <artifactId>webapp_common</artifactId>
          <version>0.0.1-SNAPSHOT</version>
      </dependency>
  </dependencies>
</project>

5,webapp_common工程pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  
  <modelVersion>4.0.0</modelVersion>
  <name>webapp_common</name>
  <url>http://maven.apache.org</url>

  <artifactId>webapp_common</artifactId>
  <!-- java普通工程,打包类型为jar -->
  <packaging>jar</packaging>

  <!-- 继承webapp_aggregator的pom配置 -->
  <parent>
       <groupId>com.xf</groupId>
      <artifactId>webapp_aggregator</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <relativePath>../webapp_aggregator</relativePath> 
  </parent>

  
  <build>
      <!-- 打包后target目录下的工程名称 -->
    <finalName>webapp_common</finalName>
  </build>
</project>

5,eclipse下加入debug需要的source,点击debug configurations->apache tomcat->tomcat v8.0 at localhost->source->add,将相关的工程source添加进来,点击debug按钮启动tomcat。

6,点击debug configurations->maven build->webapp_aggregator(如果没有需要new一个),basedirectory选择webapp_aggregator所在的目录,goals中填写clean package tomcat:redeploy -e,-e参数表示打印异常。点击debug按钮即可完成编译、打包和发布到tomcat。

ps:每次pom.xml更改后,运行maven update命令更新一下。