既然maven-3确实放弃了对<;唯一性>;假</唯一性>;对于快照人工制品,似乎确实需要使用带时间戳的快照。特别是内部使用maven 3的m2eclipse似乎受到了影响,当快照不唯一时,更新快照无法工作
将所有快照设置为uniqueVersion=false似乎是以前的最佳做法
现在,切换到时间戳版本似乎没有什么大问题,毕竟它们是由一个中央nexus存储库管理的,该存储库能够在定期间隔内删除旧快照
问题在于本地开发人员工作站。他们的本地存储库确实会快速增长,并拥有独特的快照
如何处理这个问题
现在我看到了以下可能的解决方案:
- 要求开发人员定期清理存储库(这会导致大量的融合,因为删除需要很长时间,下载所需的所有内容需要更长时间)
- 设置一些脚本,从本地存储库中删除所有快照目录,并要求开发人员不时运行该脚本(比第一个脚本更好,但运行和下载当前快照仍需要相当长的时间)
- 使用dependency:purge local repository插件(从eclipse运行时确实有问题,因为打开了文件,需要从每个项目运行)
- 在每个工作站上设置nexus,并设置一个清理旧快照的作业(最好的结果,但我不想维护50多台nexus服务器,而且开发人员工作站上的内存总是很紧)
- 停止使用快照
防止本地存储库填满硬盘空间的最佳方法是什么
更新:
为了验证beaviour并提供更多信息,我设置了一个小型nexus服务器,构建两个项目(a和b),然后尝试:
a:
<;项目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“>;
<;模型版本>;lt 4&0.0/模型版本>;
<;groupId>;德格拉切</groupId>;
<;artifactId>;a</artifactId>;
<;版本>;0.0.1-快照</版本>;
<;分销管理>;
<;快照存储库>;
<;id>;nexus</id>;
<;名称>;nexus</名称>;
<;url>;http://server:8081/nexus/content/repositories/snapshots</url>;
</快照存储库>;
</分销管理>;
</项目>;
b:
<;项目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“>;
<;模型版本>;4.0.0</模型版本>;
<;groupId>;德格拉切</groupId>;
<;artifactId>;b</artifactId>;
<;版本>;0.0.1-快照</版本>;
<;分销管理>;
<;快照存储库>;
<;id>;nexus</id>;
<;名称>;nexus</名称>;
<;url>;http://server:8081/nexus/content/repositories/snapshots/</url>;
</快照存储库>;
</分销管理>;
<;存储库>;
<;存储库>;
<;id>;nexus</id>;
<;名称>;nexus</名称>;
<;快照>;
<;启用>;正确</启用>;
</快照>;
<;url>;http://server:8081/nexus/content/repositories/snapshots/</url>;
</存储库>;
</存储库>;
<;依赖关系>;
<;依赖性>;
<;groupId>;德格拉切</groupId>;
<;artifactId>;a</artifactId>;
<;版本>;0.0.1-快照</版本>;
</依赖性>;
</依赖关系>;
</项目>;
现在,当我使用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 server…),本地的reposioty会被旧版本fast
更新2:
为了测试失败的方式和原因,我做了更多的测试。每个测试都针对clean everything运行(de/glauche从机器和nexus中删除)
- 使用maven 2.2.1部署mvn:
计算机A上的本地存储库确实包含snapshot.jar+snapshot-timestamp.jar
但是:nexus中只有一个带时间戳的jar,元数据如下:
<;?xml version=“1.0”encoding=“UTF-8”?>;
<;元数据>;
<;groupId>;德格拉切</groupId>;
<;artifactId>;a</artifactId>;
<;版本>;0.0.1-快照</版本>;
<;版本控制>;
<;快照>;
<;时间戳>;20101206.200039</时间戳>;
<;buildNumber>;1</buildNumber>;
</快照>;
<;最新更新>;20101206200039</最新更新>;
</版本控制>;
</元数据>;
- 在m2eclipse(embedded 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,元数据读取:
德格拉切
A.
0.0.1-快照<;快照>; <;时间戳>;20101206.201808<;/timestamp>; <;buildNumber>;3<;/buildNumber>; <;/snapshot>; <;LastUpdate>;20101206201808<;/LastUpdate>; <;快照版本>; <;快照版本>; <;扩展>;jar<;/extension>; <;value>;0.0.1-20101206.201808-3<;/value>; <;更新>;20101206201808<;/updated>; <;/Snapshot版本>; <;快照版本>; <;扩展>;pom<;/extension>; <;value>;0.0.1-20101206.201808-3<;/value>; <;更新>;20101206201808<;/updated>; <;/Snapshot版本>; <;/Snapshot版本>;
-
在m2eclipse(embedded m3 final)中运行更新依赖项(在机器B上)->本地存储库具有snapshot.jar+snapshot-timestamp.jar:(
-
使用外部maven 2.2.1运行包目标->本地存储库具有snapshot.jar+snapshot-timestamp.jar:(
综上所述:maven3中的“部署”目标比2.2.1中的效果更好,创建机器上的本地存储库看起来不错。
但是,接收器最终总是会有很多时间限制的版本
我做错了什么
更新3
我还测试了各种其他配置,首先用artifactory->same Behavior替换nexus。然后使用linux maven 3客户端从存储库管理器下载快照->本地存储库仍然有时间戳快照:(
<;uniqueVersion>;
配置应用于已部署(通过mvn部署)到Maven存储库(如Nexus)的工件
要从Nexus中删除这些快照,您可以轻松创建一个自动作业,每天清除快照存储库。可以将其配置为保留一定数量的快照或将其保留一段时间。这非常简单,效果非常好
开发人员机器上的本地存储库中的工件从“安装”目标到达那里,并且不使用这些时间戳……它们只是不断替换唯一的快照版本,除非您也在增加版本号(例如,1.0.0-SNAPSHOT到1.0.1-SNAPSHOT)