Maven高级

目录

一、分模块设计与开发

[1.1 为什么需要分模块设计与开发?](#1.1 为什么需要分模块设计与开发?)

[1.2 分模块设计](#1.2 分模块设计)

二、继承与聚合

[2.1 继承](#2.1 继承)

[2.2 聚合](#2.2 聚合)

[2.3 继承和聚合的联系和区别](#2.3 继承和聚合的联系和区别)


一、分模块设计与开发

1.1 为什么需要分模块设计与开发?

在项目初期,我们通常会把所有的代码(Controller、Service、Mapper、POJO 等)塞进同一个大工程里。但随着业务发展,这种"单体架构"会暴露出严重的缺陷:

  • 代码臃肿,编译极慢:修改哪怕一行代码,也需要重新编译和打包整个几百 MB 的项目。

  • 复用性极差:假设你们公司有两个项目(项目 A 面向 C 端用户,项目 B 是后台管理系统),它们都需要用到同一套数据库的实体类(POJO)和工具类(Utils)。如果不分模块,你就只能靠"复制粘贴"代码,一旦数据库字段修改,两边都要改,极易出错。

  • 职责不清晰,容易越权调用:新人容易在代码里随意互相调用,导致架构混乱。

1.2 分模块设计

分模块设计的策略:

  • 策略一:按照功能模块拆分,比如:公共组件、商品模块、搜索模块、购物车模块、订单模块等。
  • 策略二:按层拆分,比如:公共组件、实体类、控制层、业务层、数据访问层。
  • 策略三:按照功能模块+ 层拆分

一个典型的电商项目分模块后,它的目录结构通常是这样的树形结构:

复制代码
shop-parent (父工程/聚合工程)
  ├── pom.xml (父 POM,统一管理依赖版本和公共配置)
  │
  ├── shop-pojo (子模块:存放所有实体类)
  │     └── pom.xml
  │
  ├── shop-common (子模块:存放通用工具类、全局异常处理等)
  │     └── pom.xml
  │
  ├── shop-mapper (子模块:存放数据库访问层接口与 XML)
  │     └── pom.xml (依赖 shop-pojo)
  │
  └── shop-service (子模块:存放业务逻辑)
        └── pom.xml (依赖 shop-mapper, shop-common)

二、继承与聚合

2.1 继承

在上面的分模块设计的项目中,每一个子模块都需要引入Lombok依赖,并且要确保这些相同的依赖的版本号是相同的,这个操作是很繁琐的。

如果不统一管理,模块 A 用了 8.0 版本的 MySQL 驱动,模块 B 用了 5.7 版本,项目整合时就会发生可怕的"依赖冲突"。

继承解决了这个问题:

继承 允许子模块继承父工程的配置。我们在父工程中统一定义依赖的版本号,子模块只需声明"我要用这个依赖",而不需要写版本号。

实现<parent>......</parent>

继承关系的实现:

1.创建maven模块tilas-parent,该工程为父工程 ,设置打包方式为pom(默认jar)

2.在子工程的pom.xml文件中,配置继承关系。

3.在父工程中配置各个工程共有的依赖(子工程会自动继承父工程的依赖)。

继承的版本锁定:

现在有这样一个场景,子工程中只有三个工程用到了jwt这个依赖,如果将这个依赖直接放到父工程中,pojo、utils同样会继承这个依赖,对项目的性能是有损害的。那么只能在子工程中一个一个的进行导入,那么该如何统一管理各个依赖的版本呢?

使用**<dependencyManagement>**来统一管理依赖版本。只需要在父工程中管理一个版本,在子工程中就不用声明依赖的版本了,实现了版本在父工程进行统一的管理。

2.2 聚合

聚合解决的是项目打包的问题。当你把项目拆分成 5 个模块后,如果需要打包部署,难道要手动进 5 个文件夹分别执行 mvn clean package 吗?

聚合就是为了解决这个问题。在父工程的 pom.xml 中,通过 <modules> 标签将所有子模块罗列出来。

效果 :你只需要在父工程执行一次 mvn install,Maven 就会自动算出各个子模块的依赖先后顺序,并帮你把所有子模块全部编译打包好。

2.3 继承和聚合的联系和区别

联系:继承与聚合都属于设计型模块,打包方式都为pom,常将两种关系制作到同一个pom文件中。

区别:
1.继承用于简化依赖配置、统一管理依赖版本,是在子工程中配置继承关系

2.聚合用于快速构建项目,是在父工程(聚合工程)中配置聚合的模块

相关推荐
counting money3 分钟前
Tomcat 专题:从基础架构到性能调优与 WebSocket 实战
java·websocket·tomcat
观无21 分钟前
若依EasyExcel实现单元格合并
开发语言·前端·javascript
雨晨源码(同名B站)23 分钟前
基于Python的网易云音乐评论数据情感化分析系统 音乐爬虫信息可视化 |SnowNLP评论情感分析
开发语言·hadoop·爬虫·python·信息可视化·毕业设计
我不是疯子是傻子37 分钟前
串口通信数据帧粘包拆包再进化:基于 Qt 的滑动窗口与 CRC 校验实战
开发语言·qt
程序员老陆1 小时前
Qt中实现窗口真全屏(覆盖Windows任务栏)
开发语言·windows·qt
xiaohaiAIgeo1 小时前
【2026年】HG/T 20656-2024化工暖通空调设计规范:新版标准的变化与影响
java·前端·javascript·科普知识
小强库计算机毕业设计1 小时前
基于 Spring Boot + Vue3 的校园管理系统
java·spring boot·后端·项目实战·管理系统·技术分享·校园管理系统实战
霸道流氓气质1 小时前
Java中信号量(Semaphore):从本地到分布式
java·开发语言·分布式
怪奇云呼军1 小时前
G.711、Opus 和重采样会拖慢识别吗?闪电智能VoiceAgent 的音频入口怎么选
java·人工智能·python·算法·云计算·音视频
编程令我快乐1 小时前
maven部分构建参数讲解
java·maven