前言
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就可以了。
