[toc]
| 单词 | 词性 | 音标 | 含义 |
|---|---|---|---|
| properties | n. (复数) | /ˈprɒpətiz/ | 属性;配置(Maven中用于定义键值对形式的配置变量,可在POM中统一管理版本号、路径等,如<properties><spring.version>5.3.0</spring.version></properties>) |
| source | n. | /sɔːs/ | 源码(编程中常指源代码文件,Maven中如maven-compiler-plugin的source配置指定Java源码版本,如<source>11</source>表示使用Java 11语法) |
| Encoding | n. | /ɪnˈkəʊdɪŋ/ | 编码(指字符编码格式,Maven中常用project.build.sourceEncoding配置源码编码,如<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>避免中文乱码) |
| RELEASE | n. / adj. | /rɪˈliːs/ | 发布;发行版本(Maven中可作为依赖版本号使用,表示使用最新的正式发布版本,如<version>RELEASE</version>,但不推荐,可能导致版本不稳定) |
Lecture11 实验06:继承
1、概念
Maven工程之间,A 工程继承 B 工程
- B 工程:父工程
- A 工程:子工程
本质上是 A 工程的 pom.xml 中的配置继承了 B 工程中 pom.xml 的配置。
2、作用
在父工程中统一管理项目中的依赖信息,具体来说是管理依赖信息的版本。
它的背景是:
- 对一个比较大型的项目进行了模块拆分。
- 一个 project 下面,创建了很多个 module。
- 每一个 module 都需要配置自己的依赖信息。
它背后的需求是:
- 在每一个 module 中各自维护各自的依赖信息很容易发生出入,不易统一管理。
- 使用同一个框架内的不同 jar 包,它们应该是同一个版本,所以整个项目中使用的框架版本需要统一。
- 使用框架时所需要的 jar 包组合(或者说依赖信息组合)需要经过长期摸索和反复调试,最终确定一个可用组合。这个耗费很大精力总结出来的方案不应该在新的项目中重新摸索。
通过在父工程中为整个项目维护依赖信息的组合既保证了整个项目使用规范、准确的 jar 包;又能够将以往的经验沉淀下来,节约时间和精力。
3、举例
在一个工程中依赖多个 Spring 的 jar 包
- spring-core
- spring-beans
- spring-context
- spring-expression
- spring-aop
使用 Spring 时要求所有 Spring 自己的 jar 包版本必须一致。为了能够对这些 jar 包的版本进行统一管理,我们使用继承这个机制,将所有版本信息统一在父工程中进行管理。
4、操作
①创建父工程
先和以前一样创建Maven工程,然后把打包方式改成pom:

只有打包方式为 pom 的 Maven 工程能够管理其他 Maven 工程
打包方式为 pom 的 Maven 工程中不写业务代码,它是专门管理其他 Maven 工程的工程
②创建子工程
在父工程身上点右键:


③IDEA自动了做什么?
[1]让子工程继承父工程

[2]把子工程gv省略
子工程省略gv时,将会继承父工程的gv

[3]在父工程生成模块列表

④管理依赖
在父工程配置对依赖的管理:
<!-- 使用dependencyManagement标签配置对依赖的管理 -->
<!-- 被管理的依赖并没有真正被引入到工程 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
⑥子工程中引用那些被父工程管理的依赖
关键点:省略版本号
<!-- 子工程引用父工程中的依赖信息时,可以把版本号去掉。 -->
<!-- 把版本号去掉就表示子工程中这个依赖的版本由父工程决定。 -->
<!-- 具体来说是由父工程的dependencyManagement来决定。 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
</dependencies>
⑦在父工程中升级依赖信息的版本
……
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.4.RELEASE</version>
</dependency>
……
然后在子工程中查看依赖列表
⑧在父工程中声明自定义属性
<!-- 通过自定义属性,统一指定Spring的版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 自定义标签,维护Spring版本数据 -->
<atguigu.spring.version>4.3.6.RELEASE</atguigu.spring.version>
</properties>
在需要的地方使用${}的形式来引用自定义的属性名:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${atguigu.spring.version}</version>
</dependency>
真正实现“一处修改,处处生效”。
5、实际意义

编写一套符合要求、开发各种功能都能正常工作的依赖组合并不容易
如果公司里已经有人总结了成熟的组合方案,那么再开发新项目时,如果不使用原有的积累,而是重新摸索,会浪费大量的时间
为了提高效率,我们可以使用工程继承的机制,让成熟的依赖组合方案能够保留下来
如上图所示,公司级的父工程中管理的就是成熟的依赖组合方案,各个新项目、子系统各取所需即可