【maven】maven 快照机制
原创
©著作权归作者所有:来自51CTO博客作者wx636dc453ed367的原创作品,请联系作者获取转载授权,否则将追究法律责任
搞不明白这个,拉取或者更新时就可能遇到各种各样的问题。
首先release包的逻辑是很清晰的,就是看本地有没有,没有就从远程拉。这个是合理的,因为同一个版本号只能在仓库里发一个包,意味着只要本地有了,就应该是最新的。不应该允许从远程仓库删除release包。
快照版本呢?
每一个快照版本可以有多个包,每一个包都有对应的时间戳。发快照包时,远程maven仓库会将时间戳记录在一个叫做maven-meta的xml文件里。
可能长这样:
<?xml version="1.0" encoding="UTF-8"?>
<metadata modelVersion="1.1.0">
<groupId>com.liyao</groupId>
<artifactId>testMaven</artifactId>
<version>2.0-SNAPSHOT</version>
<versioning>
<snapshot>
<localCopy>true</localCopy>
</snapshot>
<lastUpdated>20190521062352</lastUpdated>
<snapshotVersions>
<snapshotVersion>
<extension>jar</extension>
<value>2.0-SNAPSHOT</value>
<updated>20190521062352</updated>
</snapshotVersion>
<snapshotVersion>
<extension>pom</extension>
<value>2.0-SNAPSHOT</value>
<updated>20190521062352</updated>
</snapshotVersion>
</snapshotVersions>
</versioning>
</metadata>
里面记录了jar和pom的最新更新时间。
其实本地仓库也会有一个对应的xml文件,叫做maven-meta-local,这是对远程的一个拷贝。
那么当执行一次构件时,里面有一个快照依赖,如何判定快照版本呢?
首先会检测一下是否到了更新周期,如果到了就需要拿本地仓库的最新时间戳和远程仓库的最新时间戳比较,拿最新的包。如果没有到更新周期,就直接使用本地最新的包。
那么什么是更新周期呢?更新周期决定了是否要拿远程仓库中最新包的来比较,默认是一天一次。这个可以在./m2/settings.xml中配置:
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>central</id>
<url>http://central</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
</profile>
选项有:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。
其实构建时加上-U参数就是强制让maven从远程拉。