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.聚合用于快速构建项目,是在父工程(聚合工程)中配置聚合的模块

相关推荐
不知名的老吴5 小时前
C++ 中函数对象的形式概述
开发语言·c++
星秀日5 小时前
Spring Boot + Sa-Token 实时聊天系统:用户注册流程源码深度剖析
java·人工智能·spring·状态模式
Shan12056 小时前
C++中函数对象之重载 operator()
开发语言·c++·算法
HelloWorld1024!6 小时前
c++核心之万字详解 * 和 & 所有用法(指针、引用、取地址、解引用、常量修饰)
开发语言
Legendary_0086 小时前
解析 PD Sink 与 LDR6500U:Type-C 取电的核心密码
c语言·开发语言
冴羽yayujs6 小时前
JavaScript 9 个先有库再有 API 的故事
开发语言·javascript·ecmascript
回忆2012初秋6 小时前
.NET 8.0 实战:基于 MQTTnet 封装高可用的 MQTT 发布/订阅工具类
开发语言·mqtt·.net
油丶酸萝卜别吃6 小时前
JavaScript 深度合并函数 deepMerge 实现指南(附完整测试用例)
开发语言·javascript·测试用例
念恒123066 小时前
Python(for循环进阶)
开发语言·python