企業級專案往往包含十數個模組 (common、system、log、reports、monitor...)。Maven 聚合 解決「一鍵構建所有模組」,繼承 解決「消除重複配置」。二者結合,構建出清晰、可維護的多模組工程。
<project ...>
<modelVersion>4.0.0</modelVersion>
<groupId>com.uidp</groupId>
<artifactId>UidpWeb</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging> <!-- 關鍵:聚合模組打包類型必須為 pom -->
<name>UidpWeb</name>
<modules>
<module>parent</module> <!-- 父 POM 模組 -->
<module>ThirdParty</module>
<module>common</module>
<module>log/pom-pack.xml</module> <!-- 指定子模組 POM 路徑 -->
<module>biz/pom-pack.xml</module>
<module>customer/pom-pack.xml</module>
<module>strategy/pom-pack.xml</module>
<module>reports/pom-pack.xml</module>
<module>monitor/pom-pack.xml</module>
<module>sysmgr/pom-pack.xml</module>
<module>pom-app.xml</module> <!-- 統一打 WAR 包 -->
</modules>
</project>
<packaging>pom</packaging>:聚合模組無源碼,僅作為構建入口<modules>:聲明參與聚合的子模組相對路徑<module>../parent</module> 相對路徑執行 mvn clean install 於聚合 POM 目錄,Maven 會:
<module><project ...>
<modelVersion>4.0.0</modelVersion>
<groupId>com.uidp</groupId>
<artifactId>UidpParent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<properties> <!-- 統一版本管理 -->
<springframework.version>3.2.8.RELEASE</springframework.version>
<mybatis.version>3.2.2</mybatis.version>
<junit.version>4.11</junit.version>
<maven-compiler-plugin.version>3.1</maven-compiler-plugin.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 更多屬性... -->
</properties>
<dependencyManagement> <!-- 依賴版本鎖定,子模組引用時可省略版本 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${springframework.version}</version>
</dependency>
<!-- 所有 Spring、MyBatis、Logging、Jackson、Servlet 等依賴... -->
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<!-- 更多插件管理... -->
</plugins>
</build>
<distributionManagement> <!-- 統一發布配置 -->
<repository>...</repository>
<snapshotRepository>...</snapshotRepository>
</distributionManagement>
</project>
<project ...>
<parent>
<groupId>com.uidp</groupId>
<artifactId>UidpParent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../parent/pom.xml</relativePath> <!-- 關鍵:指定父 POM 相對路徑 -->
</parent>
<artifactId>log</artifactId> <!-- 子模組必須聲明自己的 artifactId -->
<packaging>war</packaging>
<dependencies>
<!-- 從 dependencyManagement 引用,無需版本號 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<!-- 更多依賴... -->
<!-- 模組專屬依賴 (不在父 POM 中) -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>1.8.6</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>7.2.2.v20101205</version>
<configuration>...</configuration>
</plugin>
</plugins>
</build>
</project>
| 特性 | dependencyManagement | dependencies |
|---|---|---|
| 作用 | 聲明依賴坐標與版本 (模板) | 實際引入依賴到構建路徑 |
| 傳遞性 | 不直接引入,子模組需聲明才生效 | 直接引入,傳遞依賴自動帶入 |
| 版本鎖定 | 統一版本,避免衝突 | 若未聲明版本,向上查找 Management |
| 典型用法 | 父 POM 定義版本庫 | 子模組按需引用 |
groupId, version (子模組可覆寫)description, organization, inceptionYear, url, developers, contributorsbuild (源碼目錄、輸出目錄、插件、插件管理), reportingdependencies, dependencyManagementrepositories, pluginRepositories, distributionManagementissueManagement, ciManagement, scm, mailingListsproperties預設 relativePath=../pom.xml (父目錄)。若父 POM 不在父目錄,**必須顯式指定**:
<parent> <relativePath>../parent/pom.xml</relativePath> </parent>
否則本地倉庫無父 POM 時構建失敗。
UidpWeb 聚合 parent,parent 再被各業務模組繼承)packaging 必須為 pomartifactId 必須顯式聲明,避免坐標衝突dependencyManagement 中統一版本,子模組引用省略版本pluginManagementmvn dependency:analyze 檢測未使用/未聲明依賴掌握聚合與繼承,是從「會用 Maven」進階到「治理 Maven 多模組工程」的分水嶺。