现在 maven-3 确实放弃了对快照工件的 <uniqueVersion>false</uniqueVersion> 的支持,看来您确实需要使用带时间戳的 SNAPSHOTS。特别是在内部使用 maven 3 的 m2eclipse 似乎受到了影响,当 SNAPSHOTS 不唯一时,更新快照不起作用。
将所有快照设置为 uniqueVersion=false之前似乎是最佳实践
现在,切换到时间戳版本似乎没有什么大问题,毕竟它们是由一个中央关系存储库管理的,它能够定期删除旧快照。
问题在于本地开发人员工作站。他们的本地存储库很快就会通过独特的快照变得非常大。
如何处理这个问题?
现在我看到以下可能的解决方案:
- 要求开发人员定期清除存储库(这会导致很多麻烦,因为删除需要很长时间,下载所需的一切需要更长的时间)
- 设置一些脚本,从本地存储库中删除所有SNAPSHOT目录,并要求开发人员不时运行该脚本(比第一个更好,但仍然需要相当长的时间来运行和下载当前快照)
- 使用依赖:purge-local-repository 插件(从eclipse运行时确实有问题,由于打开文件,需要从每个项目运行)
- 在每个工作站上设置 nexus 并设置清理旧快照的作业(最好的结果,但我不想维护 50 多个 nexus 服务器,而且开发人员工作站上的内存总是很紧张)
- 完全停止使用 SNAPSHOTS
防止本地存储库填满硬盘空间的最佳方法是什么?
更新:
为了验证行为并提供更多信息,我设置了一个小型 nexus 服务器,构建两个项目(a 和 b)并尝试:
A:
<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>
乙:
<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”)
在构建大量快照的环境中(想想哈德逊服务器......),本地存储库很快就会被旧版本填满
更新 2:
为了测试失败的方式和原因,我做了更多的测试。每个测试都针对干净的所有内容运行(de/glauche 从机器和连接中删除)
- mvn 使用 Maven 2.2.1 部署:
机器 A 上的本地存储库确实包含 snapshot.jar + snapshot-timestamp.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 上)-> 本地存储库有 snapshot.jar + snapshot-timestamp.jar :(
- 使用外部 maven 2.2.1 运行包目标 -> 本地存储库具有 snapshot.jar + snapshot-timestamp.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 上)-> 本地存储库有 snapshot.jar + snapshot-timestamp.jar :(
使用外部 maven 2.2.1 运行包目标 -> 本地存储库具有 snapshot.jar + snapshot-timestamp.jar :(
因此,回顾一下:maven3 中的“部署”目标比 2.2.1 中的效果更好,创建机器上的本地存储库看起来不错。但是,接收器总是以许多带有时间戳的版本结束......
我究竟做错了什么 ?
更新 3
我还测试了其他各种配置,首先用人工制品替换 nexus -> 相同的行为。然后使用 linux maven 3 客户端从存储库管理器下载快照 -> 本地存储库仍然有时间戳快照 :(