您如何有效地处理 maven-3 带时间戳的快照?
现在,maven-3 确实放弃了对<uniqueVersion>false</uniqueVersion>快照伪影的支持,似乎你真的需要使用带时间戳的快照。特别是m2eclipse,它在内部确实使用maven 3似乎受到它的影响,当快照不是唯一的时,更新快照不起作用。
以前似乎是最佳做法,将所有快照设置为 uniqueVersion=false
现在,切换到带时间戳的版本似乎没有大问题,毕竟它们由中央nexus存储库管理,该存储库能够定期删除旧快照。
问题是本地开发人员工作站。他们的本地存储库确实通过独特的快照迅速变得非常大。
如何处理这个问题?
现在我看到了可能的解决方案:
- 要求开发人员定期清除存储库(这会导致很多麻烦,因为删除需要很长时间,下载所需的所有内容需要更长的时间)
- 设置一些脚本,该脚本确实会从本地存储库中删除所有SNAPSHOT目录,并要求开发人员不时运行该脚本(比第一个更好,但仍然需要相当长的时间来运行和下载当前快照)
- 使用依赖关系:purge-local-repository插件(从eclipse运行时确实存在问题,由于文件打开,需要从每个项目运行)
- 在每个工作站上设置nexus并设置一个工作来清理旧快照(最好的结果,但我不想维护50多个nexus服务器,而且开发人员工作站上的内存总是很紧张)
- 完全停止使用快照
防止本地存储库填满硬盘空间的最佳方法是什么?
更新:
为了验证beaviour并提供更多信息,我设置了一个小型nexus服务器,构建两个项目(a和b)并尝试:
一个:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>de.glauche</groupId>
<artifactId>a</artifactId>
<version>0.0.1-SNAPSHOT</version>
<distributionManagement>
<snapshotRepository>
<id>nexus</id>
<name>nexus</name>
<url>http://server:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
</project>
b:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>de.glauche</groupId>
<artifactId>b</artifactId>
<version>0.0.1-SNAPSHOT</version>
<distributionManagement>
<snapshotRepository>
<id>nexus</id>
<name>nexus</name>
<url>http://server:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
<repositories>
<repository>
<id>nexus</id>
<name>nexus</name>
<snapshots>
<enabled>true</enabled>
</snapshots>
<url>http://server:8081/nexus/content/repositories/snapshots/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>de.glauche</groupId>
<artifactId>a</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
现在,当我使用maven并在“a”上运行“deploy”时,我将拥有
a-0.0.1-SNAPSHOT.jar
a-0.0.1-20101204.150527-6.jar
a-0.0.1-SNAPSHOT.pom
a-0.0.1-20101204.150527-6.pom
在本地存储库中。每次运行部署目标时都有一个新的时间戳版本。当我尝试从nexus服务器更新快照时,也会发生同样的情况(关闭“a”项目,从本地存储库中删除它,构建“b”)
在构建大量快照的环境中(想想hudson服务器...),本地存储库很快就会被旧版本填满
更新 2:
为了测试如何以及为什么这是失败的,我做了更多的测试。每个测试都是针对干净的所有内容运行的(de/glauche 从计算机和联结中获取删除)
- mvn deploy with maven 2.2.1 :
计算机 A 上的本地存储库包含快照.jar + 快照时间戳.jar
但是:在nexus中只有一个带时间戳的jar,元数据显示为:
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>de.glauche</groupId>
<artifactId>a</artifactId>
<version>0.0.1-SNAPSHOT</version>
<versioning>
<snapshot>
<timestamp>20101206.200039</timestamp>
<buildNumber>1</buildNumber>
</snapshot>
<lastUpdated>20101206200039</lastUpdated>
</versioning>
</metadata>
- 在 m2eclipse(嵌入式 m3 final)中运行更新依赖项(在计算机 B 上) - >本地存储库具有快照.jar + 快照时间戳.jar :(
- 使用外部 maven 2.2.1 运行包目标 ->本地存储库具有快照.jar + 快照时间戳.jar :(
好的,下次尝试使用maven 3.0.1(删除项目a的所有痕迹后)
机器 A 上的本地存储库看起来更好,只有一个没有时间戳的 jar
-
在nexus中只有一个带时间戳的jar,元数据显示为:
de.glauche a 0.0.1-SNAPSHOT
<snapshot> <timestamp>20101206.201808</timestamp> <buildNumber>3</buildNumber> </snapshot> <lastUpdated>20101206201808</lastUpdated> <snapshotVersions> <snapshotVersion> <extension>jar</extension> <value>0.0.1-20101206.201808-3</value> <updated>20101206201808</updated> </snapshotVersion> <snapshotVersion> <extension>pom</extension> <value>0.0.1-20101206.201808-3</value> <updated>20101206201808</updated> </snapshotVersion> </snapshotVersions>
在 m2eclipse(嵌入式 m3 final)中运行更新依赖项(在计算机 B 上) - >本地存储库具有快照.jar + 快照时间戳.jar :(
使用外部 maven 2.2.1 运行包目标 ->本地存储库具有快照.jar + 快照时间戳.jar :(
所以,回顾一下:maven3中的“部署”目标比2.2.1中更好,创建计算机上的本地存储库看起来很好。但是,接收器总是以许多时间戳版本结束...
我做错了什么?
更新 3
我还测试了各种其他配置,首先用伪影替换nexus - >相同的行为。然后使用 linux maven 3 客户端从存储库管理器下载快照 ->本地存储库仍具有带时间戳的快照:(