目錄
一、為什么需要使用Maven工程
二、聚合工程的結構
三、聚合工程實現步驟?
四、父工程統一管理版本
五、編譯打包
? ? ? ? 大家好,我是jstart千語。想著平時開發項目似乎都是用maven來管理的,并且大多都是聚合工程。而且在maven的聚合工程中,通常與maven繼承一起使用。有時候可能會把這兩者混淆,所以在這里做一些總結吧。
一、為什么需要使用Maven工程
1、統一依賴和版本
不同模塊可能都要用相同的第三方庫(如 Spring、MyBatis 等),如果在各自
pom.xml
中單獨聲明,版本管理非常混亂。父 POM 通過
<dependencyManagement>
集中聲明依賴版本,子模塊直接引用即可,實現“統一升級一次、全項目生效”。2、集中構建與發布
多模塊聚合后,只需在父工程執行一次
mvn clean install
,即可編譯、測試、打包所有子模塊。集中發布時,Maven 會自動按照模塊間的依賴順序來部署,避免手動一個一個打包。
3、復用公共代碼
將通用工具、常量、DTO 等抽離到
common
或類似模塊中,避免在每個服務里重復實現。不同服務只需依賴同一個公共模塊,既減少重復,又便于統一更新維護。
4、支持靈活的環境配置
父 POM 可以定義多套 Profile(如
dev
、test
、prod
),根據激活的 Profile 加載不同的資源或插件配置。各子模塊通過繼承父配置,實現環境切換無需改各自代碼。
二、聚合工程的結構
my-project/
│
├── pom.xml ? ? ? ? ? ? ? ? ? ? ← 聚合父 POM(packaging = pom)
│
├── common/ ? ? ? ? ? ? ? ? ? ? ← 通用工具模塊
│ ? └── pom.xml
│
├── service-a/ ? ? ? ? ? ? ? ? ?← 服務 A 模塊
│ ? └── pom.xml
│
├── service-b/ ? ? ? ? ? ? ? ? ?← 服務 B 模塊
│ ? └── pom.xml
│
└── web-app/ ? ? ? ? ? ? ? ? ? ?← Web 前端或 Spring Boot 模塊
? ? └── pom.xml
?說明:
聚合工程:?頂層pom.xml所在的模塊不包含業務的空工程(只有一個pom.xml文件)作用:可以將多個編組通過聚合實現對所包含的模塊進行同步構建。并且,某個模塊發生變化時,其他模塊若是與這個模塊關聯,就要同步更新,此時可以用聚合工程來批量解決。
三、聚合工程實現步驟?
(1)創建一個新的模塊:父工程(管理工程),將其打包方式設置為 pom
(2)在父工程下新建模塊
?(3)idea自動識別、并添加了相關信息
?
(4)至此,其實一個聚合工程就完成了。我們再多new幾個模塊試試
四、父工程統一管理版本
在父工程中的 dependencyManagement 標簽里引入依賴,這樣表示標簽下面都是可選依賴,子模塊可以按需要引入,并且不需要再指定版本。如:
<dependencyManagement><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.32</version></dependency></dependencies></dependencyManagement>
并且,在父工程可以引入一些pom文件,用來統一指定框架使用的版本,減少版本沖突?
如:指定springboot相關的依賴都進行統一的版本控制,子模塊引入springboot相關的依賴時,都不需要引入版本號了
<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.4.2</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
并且,還可以在父工程統一更換遠程倉庫:
<repositories><repository><id>central</id> <!--表示要替換中央倉庫--><name>aliyun maven</name> <!--對該倉庫的描述,非必須--><url>https://maven.aliyun.com/repository/central</url> <!--倉庫地址--><layout>default</layout> <!--遵循 Maven 的標準目錄結構:g a v 形式--><releases><enabled>true</enabled> <!-- 表示允許從該倉庫獲取發布版本(releases版本)--></releases><snapshots><enabled>true</enabled> <!--表示允許從該倉庫獲取快照版本(snapshots版本)--></snapshots></repository></repositories>
五、編譯打包
將maven打包成jar文件
<artifactId>demo-starter</artifactId><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties>
<build><finalName>${project.artifactId}</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.3.0.RELEASE</version><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>