Maven - 繼承和聚合
*聚合(多模塊)
在一個項目中 往往有多個模塊組成 例如有項目demo 下面有a, b兩個模塊
為了能使用一條命令就能構建demo-a, demo-b兩個模塊, 需要創建一個額外的聚合模塊, 然后通過該模塊構建整個項目的所有模塊。
聚合模塊(demo-parent) pom:
- <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>
- <groupId>com.x.demo</groupId>
- <artifactId>demo-parent</artifactId>
- <packaging>pom</packaging>
- <version>0.0.1-SNAPSHOT</version>
- <name>demo-parent Maven Webapp</name>
- <url>http://maven.apache.org</url>
- <modules>
- <module>../demo-a</module>
- <module>../demo-b</module>
- </modules>
- </project>
模塊a(demo-a) pom:
- <project xmlns="<a href="http://maven.apache.org/POM/4.0.0">http://maven.apache.org/POM/4.0.0</a>" xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>"
- xsi:schemaLocation="<a href="http://maven.apache.org/POM/4.0.0">http://maven.apache.org/POM/4.0.0</a> <a href="http://maven.apache.org/maven-v4_0_0.xsd">http://maven.apache.org/maven-v4_0_0.xsd</a>">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.x.demo</groupId>
- <artifactId>demo-a</artifactId>
- <packaging>jar</packaging>
- <version>0.0.1-SNAPSHOT</version>
- <name>demo-a Maven Webapp</name>
- <url>http://maven.apache.org</url>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
- <build>
- <finalName>demo-a</finalName>
- </build>
- </project>
模塊b(demo-b) pom:
- <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>
- <groupId>com.x.demo</groupId>
- <artifactId>demo-b</artifactId>
- <packaging>jar</packaging>
- <version>0.0.1-SNAPSHOT</version>
- <name>demo-b Maven Webapp</name>
- <url>http://maven.apache.org</url>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
- <build>
- <finalName>demo-b</finalName>
- </build>
- </project>
額外模塊(demo-parent) pom中的modules節點有多個module,每個module的值都是一個被聚合模塊的相對目錄。
關于聚合模塊目錄與其他模塊的目錄主要有兩種形式:
a.父子關系:
父子關系 聚合模塊的pom:
- <modules>
- <module>demo-a</module>
- <module>demo-b</module>
- </modules>
a.平行目錄:
平行目錄 聚合模塊的pom:
- <modules>
- <module>../demo-a</module>
- <module>../demo-b</module>
- </modules>
最后在聚合模塊(demo-parent)的pom上面 運行mvn命令 根據聚合順序依次構建多個模塊。
*繼承
上面的例子中, a,b兩個模塊都依賴junit, 為了消除重復,可以使用pom的繼承,以達到一處聲明,多處使用的目的。
聚合模塊(demo-parent) pom:
- <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>
- <groupId>com.x.demo</groupId>
- <artifactId>demo-parent</artifactId>
- <packaging>pom</packaging>
- <version>0.0.1-SNAPSHOT</version>
- <name>demo-parent Maven Webapp</name>
- <url>http://maven.apache.org</url>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
- <modules>
- <module>../demo-a</module>
- <module>../demo-b</module>
- </modules>
- </project>
模塊a(demo-a) pom:
- <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>
- <parent>
- <groupId>com.x.demo</groupId>
- <artifactId>demo-parent</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <relativePath>../demo-parent/pom.xml</relativePath>
- </parent>
- <artifactId>demo-a</artifactId>
- <name>demo-a Maven Webapp</name>
- <build>
- <finalName>demo-a</finalName>
- </build>
- </project>
模塊b(demo-b) pom:
- <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>
- <parent>
- <groupId>com.x.demo</groupId>
- <artifactId>demo-parent</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <relativePath>../demo-parent/pom.xml</relativePath>
- </parent>
- <artifactId>demo-b</artifactId>
- <name>demo-a Maven Webapp</name>
- <build>
- <finalName>demo-b</finalName>
- </build>
- </project>
parent元素聲明父模塊,parent下的子節點groupId,artifactId,version指定父模塊的坐標,這三個元素是必須的。
節點relativePath指定父模塊pom的路徑,默認值是:../pom.xml,也就是說父pom在上一層目錄,(<relativePath>../demo-parent/pom.xml</relativePath> 表示父模塊pom和子模塊是平行目錄)
可以被繼承的POM元素:
groupId:項目id,項目坐標的核心元素
version:項目版本,項目坐標的核心元素
description:項目描述信息
organization:項目組織信息
inceptionYear:項目創世年月
developers:項目開發者信息
contributors:項目貢獻者信息
distributionManagement:項目部署配置
scm:項目的版本控制信息
mailingLists:項目郵件列表信息
properties:自定義的屬性
dependencies:項目的依賴配置
dependencyManagement:項目的依賴管理配置
repositories:項目的倉庫配置
build:項目源碼目錄配置。輸出目錄配置,插件配置等。
*依賴管理
父模塊(demo-parent) pom:
- <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>
- <groupId>com.x.demo</groupId>
- <artifactId>demo-parent</artifactId>
- <packaging>pom</packaging>
- <version>0.0.1-SNAPSHOT</version>
- <name>demo-parent Maven Webapp</name>
- <url>http://maven.apache.org</url>
- <!-- dependencyManagement 定義的依賴 需要在子pom中聲明 不然不會產生效果 -->
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
- <modules>
- <module>../demo-a</module>
- <module>../demo-b</module>
- </modules>
- </project>
模塊a(demo-a) pom:
- <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>
- <parent>
- <groupId>com.x.demo</groupId>
- <artifactId>demo-parent</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <relativePath>../demo-parent/pom.xml</relativePath>
- </parent>
- <artifactId>demo-a</artifactId>
- <name>demo-a Maven Webapp</name>
- <properties>
- <mail.version>1.4.1</mail.version>
- </properties>
- <dependencies>
- <!-- 聲明父pom中的依賴 這樣才會真正被使用 -->
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- </dependency>
- <!-- 擴展依賴 父pom中并沒有聲明 不會影響到父POM 和其他模塊 -->
- <dependency>
- <groupId>javax.mail</groupId>
- <artifactId>mail</artifactId>
- <version>${mail.version}</version>
- </dependency>
- </dependencies>
- <build>
- <finalName>demo-a</finalName>
- </build>
- </project>
- <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>
- <parent>
- <groupId>com.x.demo</groupId>
- <artifactId>demo-parent</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <relativePath>../demo-parent/pom.xml</relativePath>
- </parent>
- <artifactId>demo-b</artifactId>
- <name>demo-a Maven Webapp</name>
- <!-- 沒有聲明父pom中的依賴 不會被使用 -->
- <build>
- <finalName>demo-b</finalName>
- </build>
- </project>
父POM 中使用dependencyManagement 聲明的依賴不會給子模塊引入依賴, 只會繼承這段配置。
在模塊a(demo-a) pom中聲明了父pom中junit依賴 在執行的時候才會獲得真正的依賴信息。
模塊b(demo-b) pom中沒有聲明父pom中junit依賴 不會產生實際效果。
posted on 2014-04-01 15:20 順其自然EVO 閱讀(594) 評論(0) 編輯 收藏 所屬分類: 持續集成 、maven