Maven高级笔记
一、分模块设计与开发
(一)核心概念
分模块设计是在项目设计阶段将一个大型Java项目按功能或结构拆分为多个独立模块,每个模块专注于特定功能或职责,通过依赖管理实现模块间的协作。
(二)未分模块的问题
- 项目维护困难:多人协作单一项目,冲突频发,业务扩张后代码臃肿。
- 组件复用性差:通用工具类、实体类等无法单独提取供其他项目使用。
(三)分模块设计优势
- 便于管理维护:按模块分工开发,责任明确,降低维护成本。
- 提升复用性:通用组件单独抽离,其他模块或项目可直接依赖。
- 支持拓展:模块独立升级、替换,不影响整体项目。
(四)拆分策略
| 策略类型 | 说明 | 示例 |
|---|---|---|
| 功能模块拆分 | 按业务功能拆分 | 公共组件、商品模块、搜索模块、购物车模块、订单模块 |
| 按层拆分 | 按技术架构分层 | 公共组件、实体类、控制层、业务层、数据访问层 |
| 功能+层拆分 | 结合两种策略的混合模式 | 商品模块(含自身控制层、业务层、数据访问层)+ 公共组件层 |
(五)实践步骤(以tlias项目为例)
- 模块拆分方案
- tlias-pojo:抽取所有实体类(如Dept、Emp、PageBean等)。
- tlias-utils:抽取通用工具类(如JwtUtils、AliyunOSSOperator等)。
- tlias-web-management:保留业务功能(部门管理、员工管理等),依赖上述两个模块。
- 具体实现
- 新建Maven模块,分别命名为tlias-pojo、tlias-utils。
- 复制对应代码到新模块,保持包路径一致(如com.itheima.pojo)。
- 在新模块pom.xml中引入必要依赖(如lombok、spring-boot-starter)。
- 在tlias-web-management中删除原pojo和utils包,引入两个新模块的依赖坐标。
(六)注意事项
- 分模块需先设计后开发,避免先开发再拆分。
- 模块间依赖通过Maven坐标引入,避免硬编码依赖。
二、继承与聚合
(一)继承
1. 核心作用
- 简化依赖配置:子工程继承父工程的依赖,无需重复配置。
- 统一依赖管理:父工程集中控制依赖版本,确保所有子工程版本一致。
2. 实现方式
- 父工程配置:
- 打包方式设为pom(
<packaging>pom</packaging>)。 - 父工程可继承第三方父工程(如spring-boot-starter-parent),支持多重继承。
- 在
<<dependencies>中配置子工程通用依赖(如lombok、spring-boot-starter)。
- 打包方式设为pom(
- 子工程配置:通过
<parent>标签指定父工程坐标及相对路径。
3. 版本锁定
- 场景:部分依赖仅部分子工程使用,但需统一版本。
- 实现:父工程中通过
<dependencyManagement>标签管理版本,子工程引入依赖时无需指定版本。 - 示例:
<!-- 父工程:统一管理JWT版本 --><dependencyManagement><<dependencies><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency></</dependencies></dependencyManagement><!-- 子工程:直接引入,无需版本 --><<dependencies><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId></dependency></</dependencies>
4. 属性配置(优化版本管理)
- 父工程中通过
<properties>定义版本属性,统一维护。 - 示例:
<properties><lombok.version>1.18.34</lombok.version><jwt.version>0.9.1</jwt.version></properties><<dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency></</dependencies>
5. 关键区别
| 标签 | 作用 | 特点 |
|---|---|---|
<<dependencies> | 直接依赖 | 子工程自动继承,无需再次引入 |
<dependencyManagement> | 版本管理 | 仅锁定版本,子工程需手动引入依赖 |
(二)聚合
1. 核心作用
- 一键构建:聚合工程可统一执行编译、打包、安装等生命周期操作,自动按依赖顺序构建子模块。
2. 实现方式
- 在聚合工程(通常与父工程共用)的pom.xml中通过
<modules>标签指定子模块路径。 - 示例:
<modules><module>../tlias-pojo</module><module>../tlias-utils</module><module>../tlias-web-management</module></modules>
(三)继承与聚合对比
| 维度 | 继承 | 聚合 |
|---|---|---|
| 核心作用 | 简化依赖配置、统一版本 | 一键构建项目 |
| 配置位置 | 子工程配置父工程 | 聚合工程配置子模块 |
| 打包方式 | 均为pom | 均为pom |
| 模块性质 | 设计型模块,无业务代码 | 设计型模块,无业务代码 |
三、私服
(一)核心概念
- 私服:架设在局域网内的Maven仓库,用于团队内部资源共享,代理中央仓库。
- 仓库类型:
- RELEASE:存储稳定发布版本的资源。
- SNAPSHOT:存储开发中的快照版本资源。
- Central:代理中央仓库,缓存第三方依赖。
(二)依赖查找顺序
本地仓库 → 私服仓库 → 中央仓库
(三)资源上传与下载配置
1. 前提条件
- 已搭建私服(如Nexus),访问地址:http://localhost:8081。
- 私服默认账号:admin/admin。
2. 配置步骤
- 配置私服访问权限(maven/conf/settings.xml):
<servers><server><id>maven-releases</id><username>admin</username><password>admin</password></server><server><id>maven-snapshots</id><username>admin</username><password>admin</password></server></servers> - 配置私服镜像(加速依赖下载):
<mirrors><mirror><id>maven-public</id><mirrorOf>*</mirrorOf><url>http://localhost:8081/repository/maven-public/</url></mirror></mirrors> - 启用快照版本支持:
<profiles><profile><id>allow-snapshots</id><activation><activeByDefault>true</activeByDefault></activation><repositories><repository><id>maven-public</id><url>http://localhost:8081/repository/maven-public/</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository></repositories></profile></profiles> - 项目中配置上传地址(父工程pom.xml):
<distributionManagement><repository><id>maven-releases</id><url>http://localhost:8081/repository/maven-releases/</url></repository><snapshotRepository><id>maven-snapshots</id><url>http://localhost:8081/repository/maven-snapshots/</url></snapshotRepository></distributionManagement>
3. 资源上传指令
在父工程执行mvn deploy,自动将所有子模块上传到对应私服仓库(SNAPSHOT/RELEASE)。
(四)应用场景
- 团队内部模块共享(如A团队开发的tlias-utils供B团队使用)。
- 统一管理内部开发的公共组件,避免重复开发。
四、核心面试题
- 分模块设计的优势?
- 便于项目管理维护、提升组件复用性、支持横向拓展、模块间解耦。
<dependencyManagement>与<<dependencies>的区别?<<dependencies>:子工程自动继承依赖,直接生效。<dependencyManagement>:仅统一版本,子工程需手动引入依赖。
- 私服的作用?
- 团队内部资源共享、代理中央仓库加速下载、统一管理内部组件版本。
- Maven依赖查找顺序?
- 本地仓库 → 私服仓库 → 中央仓库。