Java 如何有效地处理maven-3时间戳快照?
既然maven-3为false for snapshot artefacts做了修改,那么您似乎真的需要使用带时间戳的快照。特别是内部使用maven 3的m2eclipse似乎受到了影响,当快照不唯一时,更新快照无法工作 似乎最好将所有快照设置为uniqueVersion=false 现在,切换到时间戳版本似乎没有什么大问题,毕竟它们是由一个中央nexus存储库管理的,该存储库能够在定期间隔内删除旧快照 问题在于本地开发人员工作站。他们的本地存储库会随着独特的快照而快速增长 如何处理这个问题 现在我看到了以下可能的解决方案:Java 如何有效地处理maven-3时间戳快照?,java,maven-3,Java,Maven 3,既然maven-3为false for snapshot artefacts做了修改,那么您似乎真的需要使用带时间戳的快照。特别是内部使用maven 3的m2eclipse似乎受到了影响,当快照不唯一时,更新快照无法工作 似乎最好将所有快照设置为uniqueVersion=false 现在,切换到时间戳版本似乎没有什么大问题,毕竟它们是由一个中央nexus存储库管理的,该存储库能够在定期间隔内删除旧快照 问题在于本地开发人员工作站。他们的本地存储库会随着独特的快照而快速增长 如何处理这个问题 现
- 要求开发人员定期清理存储库(这会导致大量的融合,因为删除需要很长时间,下载所需的所有内容需要更长时间)
- 设置一些脚本,从本地存储库中删除所有快照目录,并要求开发人员不时运行该脚本(比第一个脚本更好,但运行和下载当前快照仍需要相当长的时间)
- 使用dependency:purge local repository插件(从eclipse运行时确实有问题,因为打开了文件,需要从每个项目运行)
- 在每个工作站上设置nexus,并设置一个清理旧快照的作业(最好的结果,但我不想维护50多台nexus服务器,而且开发人员工作站上的内存总是很紧)
- 停止使用快照
// 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:
<?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:(
- 机器A上的本地存储库看起来更好,只有一个无时间戳的jar
- nexus中只有一个带时间戳的jar,元数据读取:
德格拉切 A. 0.0.1-快照<?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>
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:(
配置(通过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")