前言
maven是java常用的包管理系统。这里主要介绍下maven使用。
下载
maven需要单独下载,如果使用idea会默认集成的。它会自动下载关联相关的java库。
它的默认路径是:~/.m2
当前用户目录所在的隐藏文件。
它的默认仓库地址是: ~/.m2/repository
它的默认配置文件是: ~/.m2/setting.xml
Repository
maven主要由2个仓库的概念,local repository 本地存在的仓库,即所在的默认仓库地址,remote repository 远程所在的仓库地址。
注:图片来自于参考连接中的。
repository存放了很多的jar和插件。 当向仓库清酒插件或者依赖时,先检查local repository是否存在,存在直接返回。不存在的话,请求remote repository仓库。
Repository配置
在setting文件中,可以配置多个repository,例如:
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
Mirror
mirror相当于一个拦截器,它会拦截maven对remote repository仓库的访问,并将请求重新定向到mirror里面配置的地址。
注:图片来自于参考链接中。
Mirror配置
mirror存在于 setting.xml
文件中,可以配置多个,配置如下。
<mirrors>
<mirror>
<id>internal-repository</id>
<name>Maven Repository Manager running on repo.mycompany.com</name>
<url>http://repo.mycompany.com/proxy</url>
<mirrorOf>external:*,!foo</mirrorOf>
</mirror>
<mirror>
<id>foo-repository</id>
<name>Foo</name>
<url>http://repo.mycompany.com/foo</url>
<mirrorOf>foo</mirrorOf>
</mirror>
</mirrors>
官方参考文档:http://maven.apache.org/guides/mini/guide-mirror-settings.html
这里的id,name不重要,只是拦截器的id和名称。主要关键在于 mirrorOf
和url
。mirrofOf
决定了拦截器如何拦截,url是拦截后重定向的地址。
mirrorOf取值如下:
*
= everything 匹配所有的仓库external:*
= everything not on the localhost and not file based. 匹配非本地的仓库repo,repo1
= repo or repo1 匹配仓库1或者仓库2*,!repo1
= everything except repo1 匹配所有的仓库,repo1除外。
重点注意点:
- 如果不配置,那么它会默认走maven自己的中央仓库地址。mirrofOf是center
- 如果
mirrors
下面配置了多个mirror
,只要有1个配置了mirrofOf:*
,那么其他的都不再生效,全部走这个mirrorOf的url,所有慎重配置*
maven的整体流程
- 首先,我们的pom文件可以指定
repository
,我们的setting.xml
中的profiles
也可以指定repository
。一般推荐在xml文件中配置一个profiles,然后默认激活,这样所有的pom都不需要指定repository
地址了。如下:
<profiles>
<profile>
<!-- 重要仓库id,mirrofOf拦截的就是此id -->
<id>aliyun</id>
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>aliyun</activeProfile>
</activeProfiles>
- 当你需要下载一个新的jar时,maven首先会找到
pom
和setting.xml
中配置的repository
集合,这样就拿到了所有的仓库。 - 拿到仓库后,仓库配置了id,这里拿到了所有的仓库id。之后依次过滤
mirrors
配置的mirrorOf
拦截器。 - 如果
repository
的id和mirror的mirrorOf
的值相同,则该mirror的配置将会替代该repository
, 如果该repository
找不到任何一个对应的mirror
,则使用其本身配置的地址。
推荐最佳的配置方式
我们经常需要在公司私服的 repository
和个人需要的阿里云私服地址进行来回切换,这里推荐一种方便切换的方式。
- 首先在 setting.xml 中配置上2个
repository
地址,如下:
<profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>nexus</id>
<name>公司私服地址</name>
<url>xxxxxxxxxxxx</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</profile>
<profile>
<id>aliyun</id>
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun的maven地址</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
- 配置下拦截器
mirrors
如下:
<mirrors>
<mirror>
<id>aliyun</id>
<mirrorOf>central</mirrorOf>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
<mirror>
<id>nexus</id>
<mirrorOf>*,!aliyun</mirrorOf>
<url>xxxxxxx</url>
</mirror>
</mirrors>
- 由于默认激活了
nexus
配置,那么我们的idea就会提示出来如下的信息,可以选择了。
一下就是重点内容了:
- 如果使用的项目是公司项目,那么
profiles
采取nexus
,mirror
过滤时,会采取mirror
的nexus
配置。 - 如果使用的项目是个人项目,那么
profiles
采取aliyun
,mirror
过滤时,会采取mirror
的alimaven
配置。
原因:个人配置时,首先选择了prifiles时指定了repository是aliyun。当新的jar需要下载时,会经过mirrors拦截。 第一个 *,!aliyun
由于你选择的仓库是aliyun,所以过滤了,剩下的就是去中央仓库查找了,这里中央仓库替代了aliyun地址,就找到了。反之,公司地址一样的。
仓库id和Mirror的关联
maven需要配置一个central的mirror,代表从中央仓库获取。这里的匹配原则是:pom或者profiles中配置的repositoryId和mirror中的mirrorOf进行比较,一样的匹配到了mirror。不一样的,继续往下找。所以一般可以选择2个,一个central,一个是*.然后配置的仓库repository的id都是central就可以了。