本篇主要讲解做项目过程中学习到一些关于maven使用的知识,主要包括分模块设计、继承,继承中的版本锁定,maven的聚合以及maven私服。
目录
一、分模块设计
二、继承
三、继承中的版本锁定
maven%E7%9A%84%E8%81%9A%E5%90%88-toc" style="margin-left:0px;">四、maven的聚合
maven%E7%A7%81%E6%9C%8D-toc" style="margin-left:0px;">五、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%E7%9A%84%E8%81%9A%E5%90%88" style="margin-left:0px;text-align:justify;">四、maven的聚合
当一个项目完成之后想要打包发送的时候,由于一个项目是由多个模块构成的,然后想打包一个模块的时候此时会报错,因为依赖的其他模块没有找到,所以需要将其所依赖的模块以及父工程要先下载(install)到maven仓库中才行,然后再打包这个模块才能完成,如果当模块比较多的时候需要一个一个模块先install然后再打包主要的模块,这种方法比较费时费力,所以引出了聚合:将多个模块组织成一个整体,同时进行项目构建。需要一个不具有业务功能的“空”工程,有且仅有一个pom文件,此时可以想到父工程,这个工程中仅仅有一个pom文件,因此父工程也叫聚合工程。
构建完成后直接在聚合工程中package即可。
小结:继承和聚合的异同点:
继承用于简化依赖配置,统一管理依赖版本;聚合用于快速构建项目。
相同点:聚合与继承的pom.xml文件打包方式均为pom,可以将两种关系制作到同一个pom文件中。聚合与继承均属于设计型模块,并无实际的模块内容。
不同点:聚合是在聚合工程中配置关系,聚合可以感知到参与聚合的模块有哪些;继承是在子模块中配置关系,父工程无法感知哪些子模块继承了自己。
maven%E7%A7%81%E6%9C%8D" style="margin-left:0px;text-align:justify;">五、maven私服
首先有两个开发团队A和B,然后各自电脑上有自己的maven仓库,此时A将项目打包后安装在自己的maven本地仓库中,此时B也想用A中的模块jar包,如果B仅仅导入想用模块jar包的依赖这样是找不到的然后会从中央仓库去寻找,但是A没有上传到中央仓库所以B在中央仓库中也无法找到。有一个想法是A将jar包发送到中央仓库,此时B就可以找到这个jar包,但是中央仓库只有一个,普通人是无法将jar包上传到中央仓库的。所以引入了私服,相当于本地仓库和中央仓库之间加了个中间存储点。
那么如何将资源上传到私服以及如何从私服中下载资源:
首先要将上传的jar包下载到本地仓库,然后执行maven的指令deploy上传到私服,需要配置访问私服的用户名以及密码,由于私服中有多个仓库,所以要制定上传到哪一个仓库所以还需要配置一个仓库的url地址。在下载过程中,需要知道私服的地址,所以还需要配置私服仓库的地址url。
central仓库代表是从中央仓库下载的,另外两个是用户上传的。如下图:
- 首先要设置私服的访问用户名和密码:注意要配置两个:
2.配置上传地址:也要配置两个:
3.在mirror标签中设置下载的仓库地址,这里的url地址并不是具体哪一个仓库而是一组仓库汇聚成为的一个地址。还需要在profile标签中配置仓库组的地址,并且还需要将enabled设置为true,因为默认情况下SNAPSHOWTS的不允许下载。
以下两个id要对应起来:
然后配置完成后只需要将需要上传的模块中执行maven生命周期的deploy指令即可。
将父工程上传后其子工程也跟着上传。整体如下: