Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何有效地处理maven-3时间戳快照?_Java_Maven 3 - Fatal编程技术网

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

Java 如何有效地处理maven-3时间戳快照?,java,maven-3,Java,Maven 3,既然maven-3为false for snapshot artefacts做了修改,那么您似乎真的需要使用带时间戳的快照。特别是内部使用maven 3的m2eclipse似乎受到了影响,当快照不唯一时,更新快照无法工作 似乎最好将所有快照设置为uniqueVersion=false 现在,切换到时间戳版本似乎没有什么大问题,毕竟它们是由一个中央nexus存储库管理的,该存储库能够在定期间隔内删除旧快照 问题在于本地开发人员工作站。他们的本地存储库会随着独特的快照而快速增长 如何处理这个问题 现

既然maven-3为false for snapshot artefacts做了修改,那么您似乎真的需要使用带时间戳的快照。特别是内部使用maven 3的m2eclipse似乎受到了影响,当快照不唯一时,更新快照无法工作

似乎最好将所有快照设置为uniqueVersion=false

现在,切换到时间戳版本似乎没有什么大问题,毕竟它们是由一个中央nexus存储库管理的,该存储库能够在定期间隔内删除旧快照

问题在于本地开发人员工作站。他们的本地存储库会随着独特的快照而快速增长

如何处理这个问题

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

  • 要求开发人员定期清理存储库(这会导致大量的融合,因为删除需要很长时间,下载所需的所有内容需要更长时间)
  • 设置一些脚本,从本地存储库中删除所有快照目录,并要求开发人员不时运行该脚本(比第一个脚本更好,但运行和下载当前快照仍需要相当长的时间)
  • 使用dependency:purge local repository插件(从eclipse运行时确实有问题,因为打开了文件,需要从每个项目运行)
  • 在每个工作站上设置nexus,并设置一个清理旧快照的作业(最好的结果,但我不想维护50多台nexus服务器,而且开发人员工作站上的内存总是很紧)
  • 停止使用快照
防止本地存储库填满硬盘空间的最佳方法是什么

更新:

为了验证beaviour并提供更多信息,我设置了一个小型nexus服务器,构建两个项目(a和b),然后尝试:

a:

在本地存储库中。每次运行部署目标时都使用新的时间戳版本。当我尝试从nexus服务器更新快照时也会发生同样的情况(关闭“a”项目,从本地存储库中删除它,构建“b”)

在大量快照生成的环境中(想想hudson server…),本地的reposioty会被旧版本fast

更新2:

// copy artifact 
copyMavenArtifact(artifact: "commons-collections:commons-collections:3.2.2:jar", outputAbsoluteArtifactFilename: "${pwd()}/target/my-folder/commons-collections.jar")
为了测试失败的方式和原因,我做了更多的测试。每个测试都针对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"?>
<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>

德格拉切
A.
0.0.1-快照
20101206.200039
1.
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,元数据读取:

    <?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>
    
    德格拉切 A. 0.0.1-快照

    
    20101206.201808
    3.
    20101206201808
    罐子
    0.0.1-20101206.201808-3
    20101206201808
    聚甲醛
    0.0.1-20101206.201808-3
    20101206201808
    

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

应用于已部署工件的
配置(通过mvn部署)到Maven存储库,如Nexus

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


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

至于远程存储库这一部分,我认为前面讨论定期清除快照的答案是可行的。但是没有人解决您问题中的本地开发人员工作站同步部分

我们还没有开始使用Maven3,所以我们还没有看到快照开始在本地机器上构建

但是我们在m2eclipse上遇到了不同的问题启用并且项目存在于我们的工作区中,源代码更新通常使我们处于最前沿。但是我们发现,让m2eclipse使用Nexus中最近发布的工件来更新自己是非常困难的。我们团队中也遇到了类似的问题,尤其是问题,因为我们有一个非常大的项目gra有很多依赖项不会出现在您的工作区中,但会频繁发布快照

我很确定这可以追溯到一个I
<?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>
<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>
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()
  }
}
  <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>  
<configuration>
<outputAbsoluteArtifactFilename>true</outputAbsoluteArtifactFilename>
</configuration>
<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>
// copy artifact 
copyMavenArtifact(artifact: "commons-collections:commons-collections:3.2.2:jar", outputAbsoluteArtifactFilename: "${pwd()}/target/my-folder/commons-collections.jar")