这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战
前言
通过之前的了解,我们对MAVEN这个项目管理工具有了一定的了解,接下来我们结合项目探究一下MAVEN的一些高级应用技巧。 对于基础还不太了解的可快速过一遍这两篇【maven基础了解与安装】、【maven依赖管理与生命周期与插件】
聚合
我们都知道maven是一个项目管理工具,具有自己的本地仓库,并且本地仓库里存放着各种各样的资源,这些资源不仅仅是一些第三方提供的
jar
包,当我们通过install
将自己的项目打包上传到本地仓库,那么这个项目将具有和那些第三方jar
包一样的特性,可以供其它项目通过坐标引入,并且使用。
当我们的项目由多个模块组成时,并且不同的模块由不同的同事负责开发维护,当
B模块
做了修改后直接上传到本地仓库,A模块
事先并未收到通知,没有及时做出调整,那么就会导致整个项目就报错了,造成事故,所以我通常的做法是创建一个空模块pom工程
,它负责完成所有模块的统一管理,统一构建。
当我们需要去发布时直接发布
POM
工程,项目会一次性根据依赖顺序编译打包,如果有冲突会提前暴露出来,不至于导致项目出现故障。
聚合的作用
快速构建maven工程,一次性构建多个项目/模块
制作方式
- 创建一个空模块,打包类型定义为
pom
<packaging>pom</packaging>
- 定义当前模块构建时关联构建其它模块
<modules></modules>
<modules>
<module>bookcase-common</module>
<module>bookcase-coupon</module>
<module>bookcase-member</module>
<module>bookcase-order</module>
<module>bookcase-product</module>
<module>bookcase-ware</module>
<module>bookcase-gateway</module>
<module>bookcase-third-party</module>
<module>renren-fast</module>
<module>bookcase-search</module>
</modules>
继承
当我们的项目依赖的资源越来越多,资源与资源之间就有可能出现对同一资源不同版本进行依赖,如果不加以控制,最后整个项目就会出现各种混乱的版本,甚至会造成冲突,项目报错。 针对上述问题,利用之前创建的
pom
工程,我们可以在这里对版本进行统一控制,其它的服务都以pom
工程里的版本为基础,如果确实需要,在自己项目里的pom文件中进行修改版本,不会影响到其它项目。
继承的作用
实现子工程中沿用父工程中的配置
实现方式
1. 父工程pom文件中定义依赖以及版本
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>${elasticsearch.version}</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
可以看到我的
<version>
标签里写的并不是具体版本,而是一个变量,这个其实是maven提供的一个便捷方式,属性,我们可以在一个地方统一配置具体版本信息,方便后面对项目做升级修改
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-boot.version>2.2.6.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR9</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
<mybatis-plus.version>3.3.2</mybatis-plus.version>
<mysql.version>8.0.20</mysql.version>
<lombok.version>1.18.12</lombok.version>
<springfox-swagger2.version>2.7.0</springfox-swagger2.version>
<springfox-swagger-ui.version>2.7.0</springfox-swagger-ui.version>
<fastjson.version>1.2.47</fastjson.version>
<openfeign.version>2.2.5.RELEASE</openfeign.version>
<elasticsearch.version>7.4.2</elasticsearch.version>
</properties>
2. 子工程声明父工程坐标及位置,之后可以直接引用夫工程中的依赖,并且可以不写版本号
声明
<parent>
<artifactId>bookcase</artifactId>
<groupId>com.yang.bookcase</groupId>
<version>0.0.1-SNAPSHOT</version>
<relativePath/>
</parent>
引用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
总结
继承与聚合的区别
- 作用:
- 聚合用于快速构建项目
- 继承用于快速配置依赖
- 相同点:
- 聚合与继承的pom打包方式都是pom,并且可以放在一个pom里
- 聚合与继承都是属于管理模块,并没有实际模块内容
- 不同点
- 聚合是父工程中的配置关系,父工程可以感知有哪些模块参与聚合
- 继承是在子模块中的配置关系,父模块无法感知哪些子模块继承了自己