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命令更新一下。