Maven高级篇

本篇主要讲解做项目过程中学习到一些关于maven使用的知识,主要包括分模块设计、继承,继承中的版本锁定,maven的聚合以及maven私服。

目录

一、分模块设计

二、继承

三、继承中的版本锁定

四、maven的聚合

五、maven私服


一、分模块设计

优势:模块化,方便管理、便于团队协作;模块可以被多个项目共享和重用;可以单独构建一个小模块也可以组建成一个大模块,灵活性高。
首先一个项目需要做到分模块完成,例如一个大型项目,如果工具类以及实体类等各种操作都放到了一个模块的话,这样会很难复用以及管理,所以可以分模块进行设计:例如,之前介绍做的学习系统项目可以将pojo以及utils类分离出去各成为一个模块,如果主模块想用的话,可以直接引入相应的依赖即可。(此部分演示的是将已经完成的整体项目拆分成多个模块,但是实际开发过程中直接就先分模块然后分模块再完成项目。)

最初始的结构:

首先将原来项目中pojo包复制一份然后创建一个新的maven项目(注意此处的groupid与原项目的都保持一致),此处不需要创建springboot项目,因为只是一个简单的实体类的包,然后创建一个与原项目一样的包名:

然后复制即可完成。然后utils类同样,这样就分成了三个模块:

二、继承

将项目拆分成上述三个模块后,每个模块各有一个独立的pom文件,各自配置相应的依赖,例如,三个模块都需要引入lombok依赖,如果有多种共用的依赖,都需要引入一遍,这样会非常的冗余。所以可以使用一个父模块,抽离出相同的依赖,然后让这几个模块去继承这个父模块,这样可以做到简化依赖配置,统一依赖管理。具体实现使用<parent>...<parent>

由于maven中一个模块只能继承一个模块(类似java中一个类只能有一个父类,但是父类可以有多个子类),他们继承一个springboot-starter-parent,那该如何引入这个父类呢?->可以在中间开辟一个父模块,让这个父模块再去继承springboot-starter-parent即可实现。

整体结构如下图:

整体流程如下:

先定义好一个父工程A ,然后在pom 文件里面设置packaging 打包方式为pom ,然后复制springboot 项目中pom 文件的父工程B ,parent 标签到父工程A 的pom 文件中,然后将springboot 项目中的父工程改为B ,然后将其他所有的子模块的父工程都改为B 并设置relativePath 标签,子工程的groupid 可以删除,因为会自动继承父工程的groupid 。最后将共同的依赖抽离出来,写到父工程A 的pom 文件中即可完成继承。

三、继承中的版本锁定

在maven中可以在父工程的pom文件中通过<dependencyManagement>来统一管理依赖版本。
案例如下:

如果在一个项目中,有几个模块没有用到jwt依赖,那没必要在父工程中配置这个依赖,但是还有另一些模块用到了这个依赖,此时就需要在这些模块中一个个去配置,但是当这个依赖的版本需要更改的时候,就要一个一个模块去查看是否用了这个依赖,然后一个一个去改,当模块比较多的时候就容易遗漏掉,所以可以在父工程中设置dependencyManagement标签进行统一管理依赖版本。

注意:如果在父工程中进行了依赖版本管理,只是统一了版本,并没有直接将依赖加进去,子工程还是需要自己配置的,但是不需要 version 标签了。

这种方法还是有些结构上复杂,所以可以用以下方式------自定义属性:

在父类的pom文件中的properties标签中填写相应依赖的版本号。然后在父类的pom文件中的相应依赖版本处写上${}版本号即可:

小结:

四、maven的聚合

当一个项目完成之后想要打包发送的时候,由于一个项目是由多个模块构成的,然后想打包一个模块的时候此时会报错,因为依赖的其他模块没有找到,所以需要将其所依赖的模块以及父工程要先下载(install)到maven仓库中才行,然后再打包这个模块才能完成,如果当模块比较多的时候需要一个一个模块先install然后再打包主要的模块,这种方法比较费时费力,所以引出了聚合:将多个模块组织成一个整体,同时进行项目构建。需要一个不具有业务功能的"空"工程,有且仅有一个pom文件,此时可以想到父工程,这个工程中仅仅有一个pom文件,因此父工程也叫聚合工程。

构建完成后直接在聚合工程中package即可。

小结:继承和聚合的异同点:

继承用于简化依赖配置,统一管理依赖版本;聚合用于快速构建项目。

相同点:聚合与继承的pom.xml文件打包方式均为pom,可以将两种关系制作到同一个pom文件中。聚合与继承均属于设计型模块,并无实际的模块内容。

不同点:聚合是在聚合工程中配置关系,聚合可以感知到参与聚合的模块有哪些;继承是在子模块中配置关系,父工程无法感知哪些子模块继承了自己。

五、maven私服

首先有两个开发团队A和B,然后各自电脑上有自己的maven仓库,此时A将项目打包后安装在自己的maven本地仓库中,此时B也想用A中的模块jar包,如果B仅仅导入想用模块jar包的依赖这样是找不到的然后会从中央仓库去寻找,但是A没有上传到中央仓库所以B在中央仓库中也无法找到。有一个想法是A将jar包发送到中央仓库,此时B就可以找到这个jar包,但是中央仓库只有一个,普通人是无法将jar包上传到中央仓库的。所以引入了私服,相当于本地仓库和中央仓库之间加了个中间存储点。


那么如何将资源上传到私服以及如何从私服中下载资源:

首先要将上传的jar包下载到本地仓库,然后执行maven的指令deploy上传到私服,需要配置访问私服的用户名以及密码,由于私服中有多个仓库,所以要制定上传到哪一个仓库所以还需要配置一个仓库的url地址。在下载过程中,需要知道私服的地址,所以还需要配置私服仓库的地址url。

central仓库代表是从中央仓库下载的,另外两个是用户上传的。如下图:

  1. 首先要设置私服的访问用户名和密码:注意要配置两个:

2.配置上传地址:也要配置两个:

3.在mirror标签中设置下载的仓库地址,这里的url地址并不是具体哪一个仓库而是一组仓库汇聚成为的一个地址。还需要在profile标签中配置仓库组的地址,并且还需要将enabled设置为true,因为默认情况下SNAPSHOWTS的不允许下载。

以下两个id要对应起来:

然后配置完成后只需要将需要上传的模块中执行maven生命周期的deploy指令即可。

将父工程上传后其子工程也跟着上传。整体如下:

相关推荐
盼海8 分钟前
排序算法(六)--堆排序
java·算法·排序算法
陈序缘14 分钟前
Rust 力扣 - 198. 打家劫舍
开发语言·后端·算法·leetcode·rust
凭君语未可17 分钟前
豆包MarsCode算法题:三数之和问题
java·算法
kirito学长-Java23 分钟前
springboot/ssm考试系统Java学生在线考试系统web学习论坛源码
java·spring boot·学习
帅气的花泽类25 分钟前
error Unexpected ‘debugger‘ statement no-debugger
java·maven
yyycqupt26 分钟前
数据库连接池(二)
linux·数据库·c++·后端·单例模式
cooldream200940 分钟前
SpringMVC 执行流程详解
java·spring·springmvc
redemption_242 分钟前
SpringMVC-01-回顾MVC
java
techdashen44 分钟前
Go context.Context
开发语言·后端·golang
凡人的AI工具箱1 小时前
40分钟学 Go 语言高并发:Select多路复用
开发语言·后端·架构·golang