项目中MAVEN的高级应用

370 阅读3分钟

这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

前言

通过之前的了解,我们对MAVEN这个项目管理工具有了一定的了解,接下来我们结合项目探究一下MAVEN的一些高级应用技巧。 对于基础还不太了解的可快速过一遍这两篇【maven基础了解与安装】【maven依赖管理与生命周期与插件】

聚合

我们都知道maven是一个项目管理工具,具有自己的本地仓库,并且本地仓库里存放着各种各样的资源,这些资源不仅仅是一些第三方提供的jar包,当我们通过install将自己的项目打包上传到本地仓库,那么这个项目将具有和那些第三方jar包一样的特性,可以供其它项目通过坐标引入,并且使用。

image.png

当我们的项目由多个模块组成时,并且不同的模块由不同的同事负责开发维护,当B模块做了修改后直接上传到本地仓库,A模块事先并未收到通知,没有及时做出调整,那么就会导致整个项目就报错了,造成事故,所以我通常的做法是创建一个空模块pom工程,它负责完成所有模块的统一管理,统一构建。

image.png

当我们需要去发布时直接发布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里
    • 聚合与继承都是属于管理模块,并没有实际模块内容
  • 不同点
    • 聚合是父工程中的配置关系,父工程可以感知有哪些模块参与聚合
    • 继承是在子模块中的配置关系,父模块无法感知哪些子模块继承了自己