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

2022-08-31 11:33:07

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


答案 1

该配置适用于已部署(通过 mvn deploy)到 Maven 存储库(如 Nexus)的项目。<uniqueVersion>

要从 Nexus 中删除这些内容,您可以轻松创建一个自动化作业来每天清除 SNAPSHOT 存储库。它可以配置为保留一定数量的剃须刀或将其保留一段时间。它超级简单,效果很好。

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


答案 2

此插件从本地存储库中删除项目的工件。用于仅保留大型本地快照的一个副本。

<plugin>         
    <groupId>org.codehaus.mojo</groupId>         
    <artifactId>build-helper-maven-plugin</artifactId>         
    <version>1.7</version>         
    <executions>           
        <execution>             
            <id>remove-old-artifacts</id>             
            <phase>package</phase>             
            <goals>               
                <goal>remove-project-artifact</goal>             
            </goals>            
            <configuration>  
                <removeAll>true</removeAll><!-- When true, remove all built artifacts including all versions. When false, remove all built artifacts of this project version -->             
            </configuration>          
        </execution>         
    </executions>       
</plugin>

推荐