Maven的聚合工程与继承
目录
一、为什么需要使用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>