参考来源:
https://www.cnblogs.com/best/p/9676515.html#_lab2_1_2
https://www.yiibai.com/maven/maven_repositories.html
一、Maven的依赖如何存放管理?
Maven中存在依赖组件(常用的是jar包、war包、pom等,也可把Zip包等通过POM文件定义为依赖组件)的地方称为仓库(Repository)。
在Maven中,仓库有三种类型:
(1)central:中央仓库
(2)local:本地仓库
(3)remote:远程仓库
(自画仓库组成图,中央仓在互联网、镜像在公司内,本地仓库在PC,远程仓库在公司外或公司内)。
1、中央仓库:
Maven的中央仓库是由Maven社区提供的资源仓库,它包含了大量的常用程序库组件(jar包)。默认Maven的中央仓库地址为:http://repo1.maven.org/maven2/
但是实际工作中,由于地域、网络等原因,从Maven中心仓库下载十分慢,可采用公司自建的镜像仓(mirror)或国内地区开放的镜像仓(如:阿里云的镜像仓:http://maven.aliyun.com/nexus/content/groups/public)
如果公司内部和外部有防火墙,并使用了HTTP代理服务组织用户直接访问互联网,这种情况下访问Maven官方中央仓库、或互联网开放的镜像仓,就需要配置proxy。
中央仓库的配置:
Maven默认中央仓库即为http://repo1.maven.org/maven2/,不需要配置什么内容。如果采用镜像,在maven安装目录/conf/setting.xml文件中配置。则配置如下:
<mirrors>
<mirror>
<id>aliyun</id>
<name>aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<mirrorOf>标签表示当前镜像替代的仓库类型,如上central标识当前镜像代替中央仓库。
<mirror>标签在setting.xml文件中可以配置多个,Maven在查找时,并不是按照在setting.xml文件中配置的先后顺序查找的,而是按照id的字母排序来优先查找的。
2、本地仓库
本地仓库是存放在开发人员开发PC上存放Maven依赖的一个文件夹,此文件夹在第一次运行Maven命令时就创建了。
Maven在执行构建任务时,根据依赖关系从中心仓库、或远程仓库下载依赖组件到本地仓库,然后本地仓库的内容供项目引用。
本地仓库的配置:
本地仓库默认创建在%USER_HOME%\.m2目录下。用户也可以在“maven安装目录/conf/setting.xml”中自定义,如:<localRepository>C:\Users\xxxx\.m2\repository\</localRepository>
3、远程仓库
一般在项目开发中,除了引用Maven中央仓库包含的常用程序库组件外,还需要:
(1)公司内部多个项目之间存在依赖,B项目开发过程中需要依赖A.jar。
(2)公司内部定义的各产品需要引用的公共依赖组件,这些依赖组件是公司私有的。
(3)项目需要指定外部其他公司、或开源组织的jar包,这些依赖组件通用性等原因,未纳入Maven中央仓库。
这种情况下,可以在项目的pom.xml中为指定公司内部存放依赖组件的仓库、或中央仓库以外的其他互联网开源组件仓库。这类仓库称之为远程仓库。
样例:
<repositories>
<repository>
<id>jboss</id>
<name>JBoss Repository</name>
<url>http://repository.jboss.com/maven2/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
<checksumPolicy>warn</checksumPolicy>
</snapshots>
<layout>default</layout>
</repository>
<repository>
<id>xxxx</id>
<name>xxxxx</name>
<url>xxxxx</url>
</repository>
</repositories>
<id>:声明远程仓库的唯一id。注意:Maven官方中央仓库的id是central,如果配置中把其他远程仓库的id设置为central,会覆盖Maven官方的中央仓库配置,后续会使用自配置的URI最为中央仓库。
<name>:远程仓库的名称,自定义。
<url>:远程仓库的地址。
<releases>和<snapshots>:标识下载Release版、或Snapshot版依赖组件的权限。通过<enable>标签控制,可以配置一个远程仓库即可以下载Release版、Snapshot版依赖组件,也可以配置两个远程仓库分别下载Release版、Snapshot版依赖组件。
<updatePolicy>:表示依赖组件的更新的频率,默认为daily,在后面下载过程详解部分再做描述。
<checksumPolicy>:用来配置Maven检查校验策略。当构建被部署到Maven仓库时,会同时部署对应的检验和文件。在下载构件时,Maven会验证校验和文件。如果校验和验证失败,当checksumPolicy配置为默认warn时,Maven执行构建时会输出警告;当配置为fail-Maven时,遇到校验和错误构建失败;当配置为ignore时,Maven忽略校验和错误。
如上远程仓库定义在某个项目的pom.xml中。但是,如果本地同步开发多个项目,远程仓库是各个项目的公共资源,不希望在每个项目的pom.xml中都配置一份,如何做呢?
答案是:可以把上面的<repositories>标签配置到Maven的setting.xml文件中,配置在<profile>标签内。样例:
<profiles>
<profile>
<repositories>
<repository>
......
</repository>
......
</repositories>
</profile>
</profiles>
Maven 从3类仓库中搜索下载依赖组件的顺序:
当我们执行 Maven 构建命令,Maven 依赖库按以下顺序进行搜索:
(1)搜索本地仓库,如果没有找到,跳到第2步。
(2)搜索中央仓库,如果找到,下载到本地仓库中,以备项目使用;如果没有找到,跳到第3步。
(3)如果自定义了远程仓库,那么也会在远程仓库中进行查找并获得依赖组件,如果都没有找到,那么Maven就会抛出异常。
二、如果需要把自开发内容放入仓库,供其他项目引用,如何做?
1、实际开发中,可能开发人员本地同步在开发A、B多个项目,B.jar依赖A.jar。希望A.jar编译、打包完毕后,A.jar也被Maven管理,通过Maven的依赖机制可以被B项目引用,如何做呢?
答案是:执行Maven的install阶段,这个阶段的作用就是把项目jar包部署到Maven本地仓。
2、在多团队配合开发中,希望自己开发的jar包通过Mave的deploy阶段部署到远程仓库,供其他团队更新引用,如何做的?
答案是:在pom.xml文件中通过<distributionManagement>标签指定。
样例:
<distributionManagement>
<repository>
<id>releases</id>
<name>public</name>
<url>http://xxxx.xxxxx1.com/artifactory/releases</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>Snapshots</name>
<url>http://xxxx.xxxxx1.com/artifactory/snapshots</url>
</snapshotRepository>
<distributionManagement>
<repository>标签表示Release版本仓。
<repository>标签表示Snapshot版本仓。
Snapshot版本仓用于保存开发过程中的不稳定版本,Release版本仓用来保存稳定的发行版本。Maven会根据模块的版本号(pom.xml中定义)是否带有-SNAPSHOT来判断是Snapshot版本还是Release版本。如果是Snapshot版本,mvn deploy时会自动发布到Snapshot版本仓。如果是Release版本,mvn deploy时会自动发布到Release版本仓。
如上远程仓库定义在某个项目的pom.xml中。如果本地同步开发多个项目,远程仓库是各个项目的公共资源,不希望在每个项目的pom.xml中都配置一份,如何做呢?
答案是:可以把上面的<distributionManagement>标签配置到Maven的setting.xml文件中,配置在<profile>标签内。
样例:
<profiles>
<profile>
<distributionManagement>
......
</distributionManagement>
</profile>
</profiles>
三、远程仓库的认证
出于安全考虑,有些远程仓库是需要我们访问认证的,这种情况下就需要配置认证信息。
和配置远程仓库地址不同,远程仓库可以配置在项目的pom.xml中。但是,远程仓库认证信息只能配置在Maven的setting.xml文件中。
原因是,项目的pom.xml属于项目源码的一部分,是需要上传到git仓库的。如果你的认证信息存放在pom.xml中,则项目的所有成员都可以看到你的用户名、密码。而setting.xml则保存在开发人员本地环境。因此,在settings.xml中配置认证信息更为安全。
setting.xml中配置远程仓库认证信息样例:
<servers>
<server>
<id>deploymentRepo</id>
<username>repouser</username>
<password>repopwd</password>
</server>
</servers>
注意:这里<id>信息十分重要,这个<id>标签信息必须和pom.xml中配置的远程仓库的<id>保持一致,Maven是通过<id>为配置的远程仓库找到正确的认证信息的。