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

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>

http://www.xdnf.cn/news/2233.html

相关文章:

  • Pygame动画实战:让游戏角色动起来!
  • Java24 抗量子加密:后量子时代的安全基石
  • 华为盘古OS深度评测:构建AI自进化系统的实践密码
  • 第一性原理 | 从哲学本源到多领域实践的探索与应用
  • 腾讯二面:TCC分布式事务 | 图解TCC|用Go语言实现一个TCC
  • MyBatis 常用扩展组件详解(含代码示例)
  • 有源晶振与无源晶振详解:区别、应用与选型指南
  • 计算机视觉中的二值马尔科夫随机场
  • 代码随想录算法训练营第五十九天 | 1.ford算法精讲 卡码网94.城市间货物运输
  • 长短板理论——AI与思维模型【83】
  • 如何在 Windows 10 中使用 WSL 和 Debian 安装 Postgresql 和 Postgis
  • Vue3的内置组件 -实现过渡动画 TransitionGroup
  • 计算机二级MS Office第九套演示文稿
  • 隐私守护者的觉醒——大数据时代,我们如何对抗“透明人”危机?
  • 单链表专题(1)
  • 豆包,Kim,deepseek对比
  • Java——令牌技术
  • Oracle EBS 零金额的AP付款无法过账数据修复
  • 蓝桥杯赛场反思:技术与心态的双重修炼
  • 基于libdxfrw库读取样条曲线并离散为点
  • 在Linux虚拟机下使用vscode,#include无法跳转问题
  • 前端开发中shell的使用场景
  • 部署yolo到k230教程
  • cloud项目同一个服务,执行不同业务需求,nacos进行分组
  • 数据结构之单链表C语言
  • 论人际关系发展的阶段
  • Scratch——第19课 正话反说问题
  • 内存池管理项目——面试题总结
  • Linux基础指令【上】
  • 【信息系统项目管理师】高分论文:论质量管理和进度管理(智慧旅游平台建设项目)