前言

maven是java常用的包管理系统。这里主要介绍下maven使用。

下载

maven需要单独下载,如果使用idea会默认集成的。它会自动下载关联相关的java库。
它的默认路径是:~/.m2 当前用户目录所在的隐藏文件。
它的默认仓库地址是: ~/.m2/repository
它的默认配置文件是: ~/.m2/setting.xml

Repository

maven主要由2个仓库的概念,local repository 本地存在的仓库,即所在的默认仓库地址,remote repository 远程所在的仓库地址。
image.png
注:图片来自于参考连接中的。

repository存放了很多的jar和插件。 当向仓库清酒插件或者依赖时,先检查local repository是否存在,存在直接返回。不存在的话,请求remote repository仓库。

Repository配置

在setting文件中,可以配置多个repository,例如:

  1. <repositories>
  2. <repository>
  3. <id>aliyun</id>
  4. <name>aliyun maven</name>
  5. <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  6. <releases>
  7. <enabled>true</enabled>
  8. </releases>
  9. <snapshots>
  10. <enabled>false</enabled>
  11. </snapshots>
  12. </repository>
  13. </repositories>

Mirror

mirror相当于一个拦截器,它会拦截maven对remote repository仓库的访问,并将请求重新定向到mirror里面配置的地址。
image.png
注:图片来自于参考链接中。

Mirror配置

mirror存在于 setting.xml 文件中,可以配置多个,配置如下。

  1. <mirrors>
  2. <mirror>
  3. <id>internal-repository</id>
  4. <name>Maven Repository Manager running on repo.mycompany.com</name>
  5. <url>http://repo.mycompany.com/proxy</url>
  6. <mirrorOf>external:*,!foo</mirrorOf>
  7. </mirror>
  8. <mirror>
  9. <id>foo-repository</id>
  10. <name>Foo</name>
  11. <url>http://repo.mycompany.com/foo</url>
  12. <mirrorOf>foo</mirrorOf>
  13. </mirror>
  14. </mirrors>

官方参考文档:http://maven.apache.org/guides/mini/guide-mirror-settings.html

这里的id,name不重要,只是拦截器的id和名称。主要关键在于 mirrorOfurlmirrofOf 决定了拦截器如何拦截,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除外。

重点注意点:

  1. 如果不配置,那么它会默认走maven自己的中央仓库地址。mirrofOf是center
  2. 如果 mirrors 下面配置了多个 mirror ,只要有1个配置了 mirrofOf:* ,那么其他的都不再生效,全部走这个mirrorOf的url,所有慎重配置*

maven的整体流程

  1. 首先,我们的pom文件可以指定 repository ,我们的 setting.xml 中的 profiles 也可以指定repository 。一般推荐在xml文件中配置一个profiles,然后默认激活,这样所有的pom都不需要指定 repository 地址了。如下:
  1. <profiles>
  2. <profile>
  3. <!-- 重要仓库id,mirrofOf拦截的就是此id -->
  4. <id>aliyun</id>
  5. <repositories>
  6. <repository>
  7. <id>aliyun</id>
  8. <name>aliyun maven</name>
  9. <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  10. <releases>
  11. <enabled>true</enabled>
  12. </releases>
  13. <snapshots>
  14. <enabled>false</enabled>
  15. </snapshots>
  16. </repository>
  17. </repositories>
  18. </profile>
  19. </profiles>
  20. <activeProfiles>
  21. <activeProfile>aliyun</activeProfile>
  22. </activeProfiles>
  1. 当你需要下载一个新的jar时,maven首先会找到 pomsetting.xml 中配置的repository 集合,这样就拿到了所有的仓库。
  2. 拿到仓库后,仓库配置了id,这里拿到了所有的仓库id。之后依次过滤 mirrors 配置的mirrorOf 拦截器。
  3. 如果 repository 的id和mirror的 mirrorOf 的值相同,则该mirror的配置将会替代该repository , 如果该repository 找不到任何一个对应的mirror,则使用其本身配置的地址。

推荐最佳的配置方式

我们经常需要在公司私服的 repository 和个人需要的阿里云私服地址进行来回切换,这里推荐一种方便切换的方式。

  1. 首先在 setting.xml 中配置上2个 repository 地址,如下:
  1. <profiles>
  2. <profile>
  3. <id>nexus</id>
  4. <repositories>
  5. <repository>
  6. <id>nexus</id>
  7. <name>公司私服地址</name>
  8. <url>xxxxxxxxxxxx</url>
  9. <releases>
  10. <enabled>true</enabled>
  11. </releases>
  12. <snapshots>
  13. <enabled>false</enabled>
  14. </snapshots>
  15. </repository>
  16. </repositories>
  17. </profile>
  18. <profile>
  19. <id>aliyun</id>
  20. <repositories>
  21. <repository>
  22. <id>aliyun</id>
  23. <name>aliyun的maven地址</name>
  24. <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  25. <releases>
  26. <enabled>true</enabled>
  27. </releases>
  28. <snapshots>
  29. <enabled>false</enabled>
  30. </snapshots>
  31. </repository>
  32. </repositories>
  33. </profile>
  34. </profiles>
  35. <activeProfiles>
  36. <activeProfile>nexus</activeProfile>
  37. </activeProfiles>
  1. 配置下拦截器 mirrors 如下:
  1. <mirrors>
  2. <mirror>
  3. <id>aliyun</id>
  4. <mirrorOf>central</mirrorOf>
  5. <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  6. </mirror>
  7. <mirror>
  8. <id>nexus</id>
  9. <mirrorOf>*,!aliyun</mirrorOf>
  10. <url>xxxxxxx</url>
  11. </mirror>
  12. </mirrors>
  1. 由于默认激活了 nexus 配置,那么我们的idea就会提示出来如下的信息,可以选择了。

image.png

一下就是重点内容了:

  • 如果使用的项目是公司项目,那么profiles采取nexusmirror过滤时,会采取mirrornexus配置。
  • 如果使用的项目是个人项目,那么profiles采取aliyunmirror过滤时,会采取mirroralimaven配置。

原因:个人配置时,首先选择了prifiles时指定了repository是aliyun。当新的jar需要下载时,会经过mirrors拦截。 第一个 *,!aliyun 由于你选择的仓库是aliyun,所以过滤了,剩下的就是去中央仓库查找了,这里中央仓库替代了aliyun地址,就找到了。反之,公司地址一样的。

仓库id和Mirror的关联

maven需要配置一个central的mirror,代表从中央仓库获取。这里的匹配原则是:pom或者profiles中配置的repositoryId和mirror中的mirrorOf进行比较,一样的匹配到了mirror。不一样的,继续往下找。所以一般可以选择2个,一个central,一个是*.然后配置的仓库repository的id都是central就可以了。

参考