上节课的内容:Spring MVC 中 RESTful 开发核心技术详解(响应处理、异常机制与拦截器)

📚 目录(点击跳转对应章节)

一、依赖管理(Dependency)
二、聚合(Aggregation)
三、继承(Inheritance)
四、聚合 vs 继承
五、属性(Properties)
六、多环境开发(Profiles)
七、测试控制
总结


一、依赖管理(Dependency)

1. 依赖传递与冲突

在这里插入图片描述

依赖传递是 Maven 的核心能力之一:

如果 A 依赖 B,B 依赖 C,那么 A 会自动依赖 C。

但这也容易带来 依赖冲突问题,常见原因包括:

  • 不同依赖引入了同一个 jar 的不同版本
  • 依赖层级过深,版本难以控制

👉 Maven 默认遵循:

  • 路径最短优先
  • 路径相同则 先声明优先

2. 可选依赖(<optional>

在这里插入图片描述

在 Maven 中,可以通过 <optional> 标签控制 依赖是否向下游项目传递

💡 注意:Maven 中 <optional> 的默认值是 false。也就是说,如果你不写 <optional>,就等同于 <optional>false</optional>

核心结论

<optional> 的本质:控制依赖是否被传递

对比说明
配置 是否传递给下游 说明
<optional>true</optional> ❌ 不传递 当前项目用,下游不一定需要
<optional>false</optional> 或不写 ✅ 传递 下游必须依赖的核心功能

💡 注意

  • <optional> 默认值是 false
  • 不写 <optional> 等同于普通依赖
适用场景
  • 插件式功能
  • 可选格式支持
  • 运行时扩展组件

3. 排除依赖(<exclusions>

在这里插入图片描述

使用别人的依赖,但其中包含你不需要或冲突的依赖时,可以使用排除。

<exclusions>
  <exclusion>
    <groupId>xxx</groupId>
    <artifactId>yyy</artifactId>
  </exclusion>
</exclusions>
经验总结

给别人用 → 用 optional
用别人的 → 用 exclusions


二、聚合(Aggregation)

1. 什么是聚合?

聚合是为了 统一构建多个模块,本身不关心依赖关系。

2. 聚合工程的创建步骤

(1)创建 Maven 模块,打包方式为 pom
<packaging>pom</packaging>
(2)在父工程中声明子模块
<modules>
  <module>module-a</module>
  <module>module-b</module>
</modules>
注意事项
  • <module> 写的是 相对路径
  • 聚合工程本身 不参与业务代码
    在这里插入图片描述

三、继承(Inheritance)

1. 什么是继承?

继承用于:

  • 统一管理依赖版本
  • 统一插件配置
  • 统一属性定义

2. 继承的完整流程

(1)创建父工程(packaging=pom
(2)父工程中定义公共依赖(或依赖管理)

在这里插入图片描述

(3)父工程声明“可被子工程选择的依赖”

在这里插入图片描述

仅管理版本,不真正引入

(4)子工程声明父工程
<parent>
  <groupId>xxx</groupId>
  <artifactId>parent</artifactId>
  <version>1.0</version>
  <!--填写父工程的pom文件-->
  <relativePath>父工程的pom文件路径</relativePath>
</parent>
(5)子工程按需选择依赖(无需写版本)
<dependency>
  <groupId>xxx</groupId>
  <artifactId>yyy</artifactId>
</dependency>
注意点
  • 子工程会 自动继承 父工程的:

    • dependencyManagement
    • properties
    • pluginManagement

四、聚合 vs 继承

对比项 聚合 继承
关注点 构建顺序 配置复用
是否有父子关系
是否影响依赖
是否必须 pom
使用目的 一次构建多个模块 统一版本与配置

👉 实际项目中通常两者一起使用


五、属性(Properties)

1. 统一管理依赖版本

(1)父工程中定义属性
<properties>
  <spring.version>5.3.30</spring.version>
</properties>
(2)使用占位符引用
<version>${spring.version}</version>

📌 好处:

  • 一处修改,全局生效
  • 版本管理清晰

2. 资源文件中引用属性

(1)定义可用于资源文件的属性
<properties>
  <jdbc.url>xxx</jdbc.url>
</properties>
(2)在资源文件中使用
jdbc.url=${jdbc.url}
(3)开启资源过滤
<resources>
  <resource>
    <filtering>true</filtering>
  </resource>
</resources>

3. 其他属性

例如:

在这里插入图片描述


六、多环境开发(Profiles)

1. 定义多环境

<profiles>
  <profile>
    <id>dev</id>
  </profile>
  <profile>
    <id>prod</id>
  </profile>
</profiles>

2. 使用指定环境

mvn clean package -Pdev

或在 settings.xml 中配置默认激活。

<activation>
	<activeByDefault>true</activeByDefault>
</activation>

七、测试控制

1. 跳过所有测试

mvn package -DskipTests

或:

<skipTests>true</skipTests>

⚠️ 注意:

  • skipTests编译测试代码,但不执行
  • maven.test.skip=true连测试代码都不编译

2. 细粒度控制测试

在这里插入图片描述

可针对:

  • 单元测试
  • 集成测试
  • 插件级别控制

总结

本文系统梳理了 Maven 中最核心、最常用的机制:

  • ✅ 依赖传递与冲突解决
  • ✅ 可选依赖与排除依赖的使用策略
  • ✅ 聚合与继承的本质区别
  • ✅ 属性统一管理
  • ✅ 多环境开发与测试控制

一句话总结:
Maven 的强大不在于“写依赖”,而在于 管理复杂工程结构的能力

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐