【maven】maven 快照机制

搞不明白这个,拉取或者更新时就可能遇到各种各样的问题。


首先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从远程拉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值