假設我在2013年03月07日08時48分52秒在我自己的電腦上使用“mvn clean install”構建了“com.my.testu:testu:1.0.1-SNAPSHOT”。
那么Maven會在本地倉庫目錄“C:\MavenRepo\com\my\testu\1.0.1-SNAPSHOT”下生成文件“maven-metadata-local.xml”,內容如下:
<?xml version="1.0" encoding="UTF-8"?> <metadata modelVersion="1.1.0"> <groupId>com.my.testu</groupId> <artifactId>testu</artifactId> <version>1.0.1-SNAPSHOT</version> <versioning> <snapshot> <localCopy>true</localCopy> </snapshot> <lastUpdated>20130307084852</lastUpdated> <snapshotVersions> <snapshotVersion> <extension>jar</extension> <value>1.0.1-SNAPSHOT</value> <updated>20110407084852</updated> </snapshotVersion> <snapshotVersion> <extension>pom</extension> <value>1.0.1-SNAPSHOT</value> <updated>20110407084852</updated> </snapshotVersion> </snapshotVersions> </versioning> </metadata>
后面的幾天,其他同事更新了com.my.testu:testu:1.0.1-SNAPSHOT的內容,並發布到了公司的Maven服務器上。
公司Maven服務器上產生了文件:
- testu-1.0.1-20130407.081828-34.jar
- testu-1.0.1-20130407.081828-34.pom
並更新了maven-metadata.xml,內容如下:
<?xml version="1.0" encoding="UTF-8"?> <metadata modelVersion="1.1.0"> <groupId>com.my.testu</groupId> <artifactId>testu</artifactId> <version>1.0.1-SNAPSHOT</version> <versioning> <snapshot> <timestamp>20130407.081828</timestamp> <buildNumber>34</buildNumber> </snapshot> <lastUpdated>20130407081828</lastUpdated> <snapshotVersions> <snapshotVersion> <extension>jar</extension> <value>1.0.1-20130407.081828-34</value> <updated>20130407081828</updated> </snapshotVersion> <snapshotVersion> <extension>pom</extension> <value>1.0.1-20130407.081828-34</value> <updated>20130407081828</updated> </snapshotVersion> </versioning> </metadata>
在這期間我的電腦上沒有發生過任何關於testu的構建。
某一天,我需要構建一個依賴於testu的項目,於是我運行了mvn clean package來打包。
這個時候,maven做了什么呢(背景:我通過配置鏡像,使我本地Maven的任何資源都是從公司的Maven服務器下載的)?
Step1:從公司的Maven服務器上下載maven-metadata.xml,重命名為“maven-metadata-<RepositoryID>.xml”,並保存到本地倉庫相應目錄。
Step2:比較maven-metadata-local.xml與maven-metadata-<RepositoryID>.xml中的lastUpdated時間戳的值。
- 如果maven-metadata-local.xml中的時間戳比較大,則終止。
- 如果maven-metadata-<RepositoryID>.xml中的時間戳較大,則從公司Maven服務器上下載最新版本。即:testu-1.0.1-20130407.081828-34.jar。這個過程分兩步:(1)下載testu-1.0.1-20130407.081828-34.jar到本地Maven倉庫。(2)將testu-1.0.1-20130407.081828-34.jar復制一份,覆蓋掉原先的testu-1.0.1-SNAPSHOT.jar。也就是說,如果Maven從遠程倉庫下載了最新的SNAPSHOT發布包的話,那么最新的待時間戳的包和xxx-SNAPSHOT包是完全一樣的。