当前位置: 首页 > news >正文

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(如 devtestprod),根据激活的 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>

相关文章:

  • 机器学习:逻辑回归实现二元分类
  • Linux扩展
  • 开源AI智能名片链动2+1模式S2B2C商城小程序源码赋能下的社交电商创业者技能跃迁与价值重构
  • 毕业项目-基于java的入侵检测与防御系统
  • 联想笔记本电脑在Windows下通过联想驱动实现风扇控制
  • MH2103 MH22D3系列的JTAG/SWD复用功能和引脚映射,IO初始化的关键点
  • 40岁的苦与乐
  • 硅谷甄选41集-71集
  • 百度AI开发者大会:连发多款AI应用,覆盖AI数字人等热门赛道
  • 【C++11】可变参数模板
  • 网络原理 - 9
  • 头歌实训之存储过程、函数与触发器
  • 【数据结构入门训练DAY-24】美国大选
  • MCP 安全困境与Agent安全框架的应对之道
  • 深度理解linux系统—— 了解操作系统
  • Maven的概念与初识Maven
  • Android JIT( ART即时编译器),Just In Time Compiler,即时编译技术
  • 【大模型】Coze AI 智能体工作流从配置到使用实战详解
  • Simulink 数据存储机制:Base Workspace、Model Workspace 与 Data Dictionary 的核心区别
  • Python + Playwright:如何在Docker 容器运行测试?
  • 第152次中老缅泰湄公河联合巡逻执法行动圆满结束
  • 特朗普说克里米亚将留在俄罗斯,泽连斯基:绝不承认
  • 2025年两院院士增选工作启动,名额均不超过100名
  • 南宁市委常委、组织部部长陈川已任广西医科大学党委书记
  • 秦洪看盘|避险情绪升温,短线或延续相对钝化状态
  • 解放日报:上海一季度GDP同比增长5.1%,两大新动能助推经济“开门红”