Maven的插件、依赖都被称为构件,由坐标在Maven中唯一确定。而仓库我理解为,一个由Nexus搭建的文件分发系统。
Maven仓库可以分为远程仓库和本地仓库,Maven先去本地仓库中找依赖,若找不到在去找远程仓库中找,若都找不到就会报错。
// 配置远程仓库(该属性在pom.xml和setting.xml均可配置,但作用范围不同)
<repositories>
<repository>
<id>centralid>//id是唯一
<name>xxxname>
<url>http://url>
<snapshots>
<enable>falseenable>//是否允许拉取快照版本
snapshots>
repository>
repositories>
远程仓库(私服)认证(id与repository中的id需要一致)
//在setting.xl中配置
<servers>
<server>
<id>xxid>
<name>namename>
<password>passwordpassword>
server>
servers>
部署到远程仓库,认证方式与仓库认证一致,id需要一致。
<distributionManagement>
<repository>
<id>idid>
<name>namename>
<url>urlurl>
repository>
distributionManagement>
小刘和小郑一起开发一个项目,小郑开发的模块B依赖于小刘开发的模块A。小郑如何获得小刘开发的最新的代码?
小郑不断询问小刘,你部署的最新版本号是多少?
要求小刘不断覆盖之前的部署?但小郑本地仓库发现版本号一致,不会去拉远程仓库的构件。
小刘可以将自己的项目版本号设置为SNAPSHOT版本,当他上传时,Maven会将他打上时间戳。
例如2.1-SNAPSHOT.jar,变成2.1-20201212.121212-12(2020年12月12号12时12分12秒第12次快照)。
这样小郑依赖于2.1-SNAPSHOT.jar时,Maven就会去拉取最新的版本,不需要而额外的操作。
1). 当依赖范围是System时,maven直接从本地文件系统解析。
2). 当依赖版本号为显示指定时,例如:xxx-2.1.jar,maven会计算出路径,先在本地仓库拉取。如果本地仓库找不到,就去远程仓库拉。
3). 当依赖版本号为LATEST或者为RELEASE时,将远程仓库的该依赖的元信息与本地该依赖元信息结合,算出该依赖的版本号。基于该依赖版本,去本地找,找不到去远程遍历拉取。
LATEST:最新的版本号,包含快照版本
RELEASE:最新发行版本
4). 当依赖版本是SNAPSHOT时,将本地元信息与远程仓库信息结合,算出最新的版本号,然后基于该版本找依赖。
当一个仓库包含了另一个仓库的所有内容,那么就称其为代理。例如我们可以使用淘宝的Maven镜像仓库,解决中央仓库拉取慢的问题
//seting.xml中配置
<mirrors>
<mirror>
<id>alimavenid>
<name>aliyun mavenname>
<url>http://maven.aliyun.com/nexus/content/groups/public/url>//镜像仓库地址
<mirrorOf>centralmirrorOf>//要代理的仓库的id
mirror>
mirrors>
maven把一个项目大致分为清理、初始化、测试、编译、打包、集成测试、安装、部署、站点这几个构建阶段。maven针对每个阶段提供plug-in机制,maven本生不作任何代码的实现,
他规定了一定的规范。
mvn有三套互相独立的生命周期:clean、default、site。
#clean包含pre-clean(清理前的准备)、clean(清理上一次构件生成的文件)、post-clean(清理后的工作)这三个阶段
mvn pre-clean
mvn clean
mvn post-clean
#default包含很多阶段,我捡几个重要的列举一下
#compile:编译源码,输出到classpath目录
#test:使用单元测试框架运行测试
#package:将编译好的代码打包成可发布格式,例如jar、war
#install:将包安装到本地,供其他项目使用
#deploy:将包复制到远程仓库,供其他开发人员使用。
#site生命周期基于pom信息,能够生成站点文档,方便团队交流。我用的较少,site阶段不再赘述
举例说明使用命令行与maven生命周期的绑定
mvn clean deploy #此命令将会执行,clean周期的pre-clean和clean阶段;以及default的所有阶段。因为deploy是default的最后一个阶段
mvn clean package #此命令执行clean的pre-clean和clean阶段;以及default的从validate到package的所有阶段
maven会内置一些插件与生命周期绑定。当然可以使用plug属性标签自定义插件绑定