如何有效地处理maven-3时间戳快照?

既然maven-3确实放弃了对<唯一性>假&lt/唯一性>对于快照人工制品,似乎确实需要使用带时间戳的快照。特别是内部使用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>德格拉切&lt/groupId>
<artifactId>a&lt/artifactId>
<版本>0.0.1-快照&lt/版本>
<分销管理>
<快照存储库>
<id>nexus&lt/id>
<名称>nexus&lt/名称>
&lt;url&gt;http://server:8081/nexus/content/repositories/snapshots</url&gt;
&lt/快照存储库&gt;
&lt/分销管理&gt;
&lt/项目&gt;

b:

&lt;项目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“&gt;
&lt;模型版本&gt;4.0.0&lt/模型版本&gt;
&lt;groupId&gt;德格拉切&lt/groupId&gt;
&lt;artifactId&gt;b&lt/artifactId&gt;
&lt;版本&gt;0.0.1-快照&lt/版本&gt;
&lt;分销管理&gt;
&lt;快照存储库&gt;
&lt;id&gt;nexus&lt/id&gt;
&lt;名称&gt;nexus&lt/名称&gt;
&lt;url&gt;http://server:8081/nexus/content/repositories/snapshots/</url&gt;
&lt/快照存储库&gt;
&lt/分销管理&gt;
&lt;存储库&gt;
&lt;存储库&gt;
&lt;id&gt;nexus&lt/id&gt;
&lt;名称&gt;nexus&lt/名称&gt;
&lt;快照&gt;
&lt;启用&gt;正确&lt/启用&gt;
&lt/快照&gt;
&lt;url&gt;http://server:8081/nexus/content/repositories/snapshots/</url&gt;
&lt/存储库&gt;
&lt/存储库&gt;
&lt;依赖关系&gt;
&lt;依赖性&gt;
&lt;groupId&gt;德格拉切&lt/groupId&gt;
&lt;artifactId&gt;a&lt/artifactId&gt;
&lt;版本&gt;0.0.1-快照&lt/版本&gt;
&lt/依赖性&gt;
&lt/依赖关系&gt;
&lt/项目&gt;

现在,当我使用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,元数据如下:

&lt;?xml version=“1.0”encoding=“UTF-8”?&gt;
&lt;元数据&gt;
&lt;groupId&gt;德格拉切&lt/groupId&gt;
&lt;artifactId&gt;a&lt/artifactId&gt;
&lt;版本&gt;0.0.1-快照&lt/版本&gt;
&lt;版本控制&gt;
&lt;快照&gt;
&lt;时间戳&gt;20101206.200039&lt/时间戳&gt;
&lt;buildNumber&gt;1&lt/buildNumber&gt;
&lt/快照&gt;
&lt;最新更新&gt;20101206200039&lt/最新更新&gt;
&lt/版本控制&gt;
&lt/元数据&gt;
  • 在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-快照

    &lt;快照&gt;
    &lt;时间戳&gt;20101206.201808&lt;/timestamp&gt;
    &lt;buildNumber&gt;3&lt;/buildNumber&gt;
    &lt;/snapshot&gt;
    &lt;LastUpdate&gt;20101206201808&lt;/LastUpdate&gt;
    &lt;快照版本&gt;
    &lt;快照版本&gt;
    &lt;扩展&gt;jar&lt;/extension&gt;
    &lt;value&gt;0.0.1-20101206.201808-3&lt;/value&gt;
    &lt;更新&gt;20101206201808&lt;/updated&gt;
    &lt;/Snapshot版本&gt;
    &lt;快照版本&gt;
    &lt;扩展&gt;pom&lt;/extension&gt;
    &lt;value&gt;0.0.1-20101206.201808-3&lt;/value&gt;
    &lt;更新&gt;20101206201808&lt;/updated&gt;
    &lt;/Snapshot版本&gt;
    &lt;/Snapshot版本&gt;
    

  • 在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客户端从存储库管理器下载快照->本地存储库仍然有时间戳快照:(

&lt;uniqueVersion&gt;配置应用于已部署(通过mvn部署)到Maven存储库(如Nexus)的工件

要从Nexus中删除这些快照,您可以轻松创建一个自动作业,每天清除快照存储库。可以将其配置为保留一定数量的快照或将其保留一段时间。这非常简单,效果非常好

开发人员机器上的本地存储库中的工件从“安装”目标到达那里,并且不使用这些时间戳……它们只是不断替换唯一的快照版本,除非您也在增加版本号(例如,1.0.0-SNAPSHOT到1.0.1-SNAPSHOT)

发表评论