Maven jar / pom download 分析。
碰上这个问题背景是:maven 中,snapshot 包是允许发布时覆盖的。那么有个问题就是,当:
- 依赖了 snapshot 版本的 jar
- 在环境执行某些操作,需要使用前面的 jar
这种情况下,maven 是如何判断是否更新本地 repository 中的 jar 呢?
基本流程
按照 jar 的 version 类型不同,可以分为:
- SNAPSHOT
- RELEASE
RELEASE 很简单,看 local 有就不会尝试去获取 remote。而 SNAPSHOT 设计初衷就是为了在不改变版本号的前提下做快速迭代,所以它支持按照时间比对的方式来更新 jar,遵循如下逻辑:
- check -o option 是否配置
- -o 是 offline 的意思,一旦使用则只访问本地 repo
- check repository 配置中的 updatePolicy 的值
- This element specifies how often updates should attempt to occur.
- 支持的值有: always, daily (default), interval:X (where X is an integer in minutes) or never
- 当 updatePolicy 策略判断通过,尝试获取 remote metadata.xml
- 比较 local & remote metadata.xml 中时间戳,决定是否执行 download
关于 metadata
关于 metadata 详情可以参考:maven metadata model
lastUpdate
当 download 失败的时候,在 local 会出现这样的文件,具体可以参考:maven-downloads-have-lastupdated-as-extension。重点是:
- 设计之初是为了减少网络带宽消耗
- 更新的 interval 是 code 中的
- 可以通过 -U 来强制每次都去更新