读书笔记 -- 《Maven实战》

前段时间Maven更新到了3.8.1版本,该版本只支持HTTPS协议仓库,公司内部升级后又需要重新将配置修改一番,然而修改过程并不容易,由于不了解Maven的配置与定位jar的关系,只能不断试错重来。想到使用Maven这么多年,每次都是直接copy别人的配置,随便改改以及替换URL,是时候好好去了解下了。

基础概念

  • maven资源标识:groupId-artifactId-version-packageing-classifier,通常packageing为jar,classifier不指定。
  • maven的仓库:
    • 本地仓库:${user.home}/.m2/repository
    • 中央仓库:id默认为central,地址为http://repo1.maven.org/maven2
    • 聚合仓库:第三方开放的Maven仓库,如阿里云,腾讯云等提供的加速库

这里很核心的一点:中央仓库(id=central)是一个特有的概念和定位,他是Maven资源的首要来源,central的配置在超级pom中,因此其等级是优先于聚合仓库低于本地仓库。

查找流程

整个查找流程如下图所示:

  • 查找本地repository
  • 查找id=central仓库,该过程会使用servers做认证,使用mirrors做拉取地址替换
  • 根据release以及snapshot的配置,查找其他仓库,该过程同样使用servers以及mirrors做认证以及地址替换

image-20220201211136346

如何配置合理?

从上面流程来看,Maven的配置逻辑本身很简单,但在一些公司中,Maven配置的复杂性主要来源于仓库众多,以蚂蚁为例,官方的仓库就有7个左右,新同学接手时,就很容易出现错误,那么怎么配置呢?

1. 选定中央仓库代理

中央仓库自然优先级最高,默认的http://repo1.maven.org/maven2 由于网络原因,拉取常常出现中断,因此中央仓库一般使用mirrors方式定向到国内镜像,而不是复写repository配置,比如下方我使用的阿里云仓库。

这里需要注意下<mirrorOf>,国内很多加速库会推荐设置为*,代表代理所有仓库,这种当然是不负责的推荐配置,阿里云的public库只是central以及jcenter的聚合,并不能代替spring,gradle,jetbrain等仓库。

1
2
3
4
5
6
<mirror>
<id>mirror</id>
<mirrorOf>central,jcenter</mirrorOf>
<name>mirror</name>
<url>https://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

2. 使用Profile划分其他仓库

profile用于圈定一批生效仓库,比如下方我定义了一个rdc profile作为默认生效的配置,其中的repositories分别配置了私有的releases&snapshot库,如果有多个release或者snapshot,那么只需要在该配置中增加即可。如果独立环境的仓库,那么可以新建一个profile圈选,在IDE中做快捷切换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<profile>
<id>rdc</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>rdc-releases</id>
<url>https://packages.aliyun.com/maven/repository/2184158-release-WRgrWp/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>rdc-snapshots</id>
<url>https://packages.aliyun.com/maven/repository/2184158-snapshot-3P70Vz/</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
存储技术 -- SSD原理简介
实践 -- 谈谈编程中的顿悟