现在Maven-3做了 下降支持 为了u003CuniqueVersion>错误的u003C/uniqueVersion>对于快照人工制品,似乎您确实需要使用时间戳的快照。尤其是在内部使用Maven 3的M2Eclipse似乎受到影响,当快照不是唯一的时,更新snapshots不起作用。

似乎最好 练习之前 将所有快照设置为唯一= false

现在,切换到时间戳版本似乎并没有大问题,毕竟它们是由中央Nexus存储库管理的,该存储库能够以常规的间隔删除旧快照。

问题是本地开发人员工作站。他们的本地存储库很快就会增长 非常 大型快照。

如何处理这个问题?

现在,我看到了可能的解决方案:

  • 要求开发人员定期清除存储库(这会导致大量的Fustration,因为删除需要很长时间,甚至更长的时间才能下载所需的所有内容)
  • 设置一些删除全部的脚本 快照 来自本地存储库的目录,并要求开发人员不时运行该脚本(比第一个要好,但仍需要花费一些时间来运行和下载当前快照)
  • 使用依赖项:清除本地重复插件(由于打开文件而从Eclipse运行时确实有问题,需要从每个项目中运行)
  • 在每个工作站上设置Nexus,并设置一个工作以清洁旧快照(最佳结果,但我不想维护50多个Nexus服务器,而且在开发人员工作站上的内存总是很紧张)
  • 完全停止使用快照

防止本地存储库填充硬盘驱动器空间的最佳方法是什么?

更新:

为了验证Beaviour并提供更多信息,我设置了一个小型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”上运行“部署”时,我将拥有

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 Server的快照时,也会发生同样的情况(关闭“一个”项目,将其从本地存储库中删除,构建“ B”)

在许多快照被构建的环境中(想想哈德逊服务器...),本地存储库充满了旧版本 快速地

更新2:

为了测试如何以及为什么失败,我进行了更多测试。每个测试都与清洁所有内容进行(de/glauche都从机器和Nexus中删除)

  • MVN与Maven 2.2.1部署:

机器A上的本地存储库确实包含快照 +快照timestamp.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)中运行更新依赖项(ON Machine B) - >本地存储库具有snapshot.jar + snapshot -timestamp.jar :(
  • 使用外部Maven 2.2.1->本地存储库的运行软件包目标具有snapshot.jar + snapshot -timestamp.jar :(

好的,下一步尝试使用Maven 3.0.1(删除了项目A的所有痕迹之后)

  • 机器A上的本地存储库看起来更好,只有一个非式罐子

  • 元数据中只有一个时间戳记的罐子,读写:

    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)中运行更新依赖项(ON Machine B) - >本地存储库具有snapshot.jar + snapshot -timestamp.jar :(

  • 使用外部Maven 2.2.1->本地存储库的运行软件包目标具有snapshot.jar + snapshot -timestamp.jar :(

因此,回顾一下:MAVEN3中的“部署”目标比2.2.1中的“部署”效果更好,创建计算机上的本地存储库看起来不错。但是,接收器总是最终获得许多时间段的版本...

我究竟做错了什么 ?

更新3

我还测试了其他各种配置,首先用伪像 - >相同的行为替换Nexus。然后使用Linux Maven 3客户端从存储库管理器下载快照 - >本地存储库仍然具有时间戳快照:(

有帮助吗?

解决方案

<uniqueVersion> 配置应用于部署(通过MVN部署)到Maven存储库(例如Nexus)的工件。

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

开发人员机器上本地存储库中的工件从“安装”目标到达那里,并且不使用这些时间戳...除非您还要增加修订号,否则它们只是继续替换一个和唯一的快照版本(例如1.0.0.0---快照到1.0.1-snapshot)。

其他提示

该插件从本地存储库中删除了项目的工件。仅保留一份大型本地快照的副本很有用。

<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>

好吧,我不喜欢任何建议的解决方案。删除Maven Cache通常会显着增加网络流量并减慢构建过程。我想要的解决方案只能使用一个简单的命令中的本地高速缓存。经过几天的搜索,我放弃了,决定写小节目。最终程序似乎在我们的环境中运作良好。因此,我决定与可能需要这种工具的其他人分享。可以从github获取来源: https://github.com/nadestin/tools/tree/master/mavencachecleanup

至于远程存储库部分,我认为以前讨论在常规间隔清除快照的答案将起作用。但是,没有人解决了您问题的本地发展工作站同步部分。

我们尚未开始使用Maven3,因此我们还没有看到快照开始在本地机器上堆积。

但是我们在M2eclipse上遇到了不同的问题。当我们启用了“工作空间分辨率”并且该项目存在于工作区内时,源更新通常使我们处于出血边缘。但是我们发现,很难让M2eclipse通过Nexus最近出版的文物进行更新。我们在团队中遇到了类似的问题,这尤其有问题,因为我们有一个非常大的项目图形……许多依赖关系不会在您的工作空间中出现,但会经常发布快照。

我敢肯定,这可以恢复到M2Eclipse中的一个问题,在M2Eclipse中,它无法完全处理快照。您可以在Eclipse的Maven控制台中看到M2Eclipse告诉您,它跳过了最近发布的快照的更新,因为它具有缓存的版本。如果您从运行配置或命令行进行-u, 小牛 会捡起元数据。但是“更新快照...”选择应该告诉M2Eclipse让Maven到期此缓存。它似乎没有通过。如果您有兴趣投票,则似乎有一个错误:https://issues.sonatype.org/browse/mngeclipse-2608

您在某个地方的评论中提到了这一点。

解决这个问题的最佳解决方法似乎是让开发人员清除当地的工作站,当时事情开始从M2eclipse内部崩溃。针对不同问题的类似解决方案...其他人报告了Maven 2.2.1和3 Backing M2eclipse的问题,我已经看过同样的问题。

我希望,如果您使用的是Maven3,则可以将其配置为仅拉出最新的快照,并在存储库所说的时间(或直到您手工到期)中缓存。希望那时您不需要在当地存储库中坐着一堆快照。

除非您谈论的是手动执行的构建服务器 mvn install 在他们。至于如何防止快照在构建服务器之类的环境上构建,我们通过让每个构建都使用自己的工作区和本地存储库来躲避子弹(尽管在Maven 2.2.1中,例如某些东西,例如POM似乎总是从〜/.m2/存储库中出来)额外的快照实际上只贴上一个构建,然后它们被掉落(然后从头开始下载)。因此,我们已经看到这种方法最终确实吞噬了更多的空间,但是它比让所有存储库中的一切都更加稳定。此选项(在哈德逊上)称为“使用私人Maven存储库”,在选择使用Maven构建时,在“构建”部分的“构建”部分的高级按钮下。这是该选项的帮助描述:

通常,哈德森使用Maven确定的本地Maven存储库 - 确切的过程似乎没有记载,但它是〜/.m2/存储库,可以被〜/.m2/settings.xml in〜/.m2/settings.xml覆盖(有关更多详细信息,请参见参考。 。)通常意味着在同一节点上执行的所有作业共享一个Maven存储库。这样做的好处是,您可以节省磁盘空间,但其缺点是有时这些构建可能会互相干扰。例如,您可能最终可能会错误地成功,只是因为您在本地存储库中拥有所有依赖项,尽管POM中的存储库都没有。

关于同时使用同一本地存储库的并发过程中,还有一些有报道的问题。

检查此选项后,Hudson将告诉Maven使用$ Workspace/.repository作为本地Maven存储库。这意味着每个工作都将获得自己的孤立的Maven存储库。它以额外的磁盘空间消耗为代价来解决上述问题。

使用此选项时,请考虑设置Maven Artifact Manager,以便您不必经常击中远程Maven存储库。

如果您希望在哈德森(Hudson)执行的所有Maven作业中激活此模式,请参阅此处描述的技术。

希望这会有所帮助 - 如果无法解决您的问题,请让我知道我错过的地方。

在Groovy, ,删除像 artifact-0.0.1-20101204.150527-6.jar 可以很简单:

root = 'path to your repository'

new File(root).eachFileRecurse {
  if (it.name.matches(/.*\-\d{8}\.\d{6}\-\d+\.[\w\.]+$/)) {
    println 'Deleting ' + it.name
    it.delete()
  }
}

安装 groovy, ,将脚本保存到文件中,并安排每周的执行,启动,登录,无论适合您。

或者,您甚至可以使用 gmavenplus-plugin. 。请注意,Maven如何将存储库位置设置为属性 settings.localRepository 然后通过配置将 repository:

  <plugin>
    <groupId>org.codehaus.gmavenplus</groupId>
    <artifactId>gmavenplus-plugin</artifactId>
    <version>1.3</version>
    <executions>
      <execution>
        <phase>install</phase>
        <goals>
          <goal>execute</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <properties>
        <property>
          <name>repository</name>
          <value>${settings.localRepository}</value>
        </property>
      </properties>
      <scripts>
        <script><![CDATA[
          new File(repository).eachFileRecurse {
            if (it.name.matches(/.*\-\d{8}\.\d{6}\-\d+\.[\w\.]+$/)) {
              println 'Deleting snapshot ' + it.getAbsolutePath()
              it.delete()
            }
          }
        ]]></script>
      </scripts>
    </configuration>
    <dependencies>
      <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy-all</artifactId>
        <version>2.3.7</version>
        <scope>runtime</scope>
      </dependency>
    </dependencies>
  </plugin>  

将以下参数添加到您的POM文件中

pom

<configuration>
<outputAbsoluteArtifactFilename>true</outputAbsoluteArtifactFilename>
</configuration>

https://maven.apache.org/plugins/maven-dependency-plugin/copy-mojo.html

POM示例

<plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.10</version>
        <executions>
          <execution>
            <id>copy</id>
            <phase>package</phase>
            <goals>
              <goal>copy</goal>
            </goals>
            <configuration>
              <artifactItems>
                <artifactItem>
                  <groupId>junit</groupId>
                  <artifactId>junit</artifactId>
                  <version>3.8.1</version>
                  <type>jar</type>
                  <overWrite>false</overWrite>
                  <outputDirectory>${project.build.directory}/alternateLocation</outputDirectory>
                  <destFileName>optional-new-name.jar</destFileName>
                </artifactItem>
              </artifactItems>
              **<outputAbsoluteArtifactFilename>true</outputAbsoluteArtifactFilename>**
              <outputDirectory>${project.build.directory}/wars</outputDirectory>
              <overWriteReleases>false</overWriteReleases>
              <overWriteSnapshots>true</overWriteSnapshots>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

詹金斯(Jenkins)的配置:

// copy artifact 
copyMavenArtifact(artifact: "commons-collections:commons-collections:3.2.2:jar", outputAbsoluteArtifactFilename: "${pwd()}/target/my-folder/commons-collections.jar")
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top