既然maven-3确实放弃了对快照工件的<uniqueVersion> false </ uniqueVersion>的支持,看来您确实需要使用带有时间戳的SNAPSHOTS。特别是在内部确实使用maven 3的m2eclipse似乎受到它的影响,当SNAPSHOTS不是唯一的时,update-snapshots无法正常工作。
将所有快照设置为uniqueVersion = false之前,这似乎是最佳实践
现在,切换到带有时间戳的版本似乎没什么大问题,毕竟它们都由中央关系存储库管理,该存储库能够定期删除旧快照。
问题是本地开发人员工作站。他们在当地的仓库很快就成长非常大的独特的快照。
如何解决这个问题?
现在,我看到了以下可能的解决方案:
- 要求开发人员定期清除存储库(这导致很多麻烦,因为删除它需要很长时间,甚至下载所有所需的时间也更长)
- 设置一些脚本,该脚本确实会从本地存储库中删除所有SNAPSHOT目录,并要求开发人员不时运行该脚本(比第一个要好,但仍然需要花费一些时间来运行和下载当前快照)
- 使用dependency: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>
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
在本地存储库中。每次运行部署目标时,都会使用新的时间戳版本。当我尝试从关系服务器更新快照时,也会发生同样的情况(关闭“ a”项目,从本地存储库中删除它,构建“ b”)
在构建大量快照的环境中(想想哈德森服务器...),本地存储库很快就会用旧版本填充
更新2:
为了测试失败的方式和原因,我进行了更多测试。每次测试都对所有内容进行清洁(de / glauche会从计算机和链接中删除)
- 使用maven 2.2.1部署mvn:
机器A上的本地存储库确实包含snapshot.jar + snapshot-timestamp.jar
但是:在连结中只有一个带有时间戳的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中运行更新依赖项(在计算机B上)(嵌入式m3 final)->本地存储库具有snapshot.jar + snapshot-timestamp.jar :(
- 使用外部Maven 2.2.1运行软件包目标->本地存储库具有snapshot.jar + snapshot-timestamp.jar :(
好的,接下来尝试使用Maven 3.0.1(在删除项目a的所有痕迹之后)
机器A上的本地存储库看起来更好,只有一个未加时间戳的jar
在关联中只有一个带有时间戳的jar,元数据显示为:
de.glauche 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中运行更新依赖项(在计算机B上)(嵌入式m3 final)->本地存储库具有snapshot.jar + snapshot-timestamp.jar :(
使用外部Maven 2.2.1运行软件包目标->本地存储库具有snapshot.jar + snapshot-timestamp.jar :(
因此,回顾一下:maven3中的“部署”目标比2.2.1中的工作更好,创建机器上的本地存储库看起来不错。但是,接收器总是以很多带有时间戳的版本结尾...
我究竟做错了什么 ?
更新3
我还测试了各种其他配置,首先用人工制品->相同行为替换了关系。然后使用linux maven 3客户端从存储库管理器下载快照->本地存储库仍带有时间戳的快照:(