1. 程式人生 > >maven多工程構建與打包

maven多工程構建與打包

原文連結

目標: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中建立這些工程

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>

6, eclipse下加入debug需要的source,點選debug configurations->apache tomcat->tomcat v8.0 at localhost->source->add,將相關的工程source新增進來,點選debug按鈕啟動tomcat。

點選debug configurations->maven build->webapp_aggregator(如果沒有需要new一個),basedirectory選擇webapp_aggregator所在的目錄,goals中填寫clean package tomcat:redeploy -e,-e引數表示列印異常。點選debug按鈕即可完成編譯、打包和釋出到tomcat。

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