이제 maven-3이 스냅 샷 아티팩트에 대한 <uniqueVersion> false </ uniqueVersion>에 대한 지원 을 중단 했으므로 실제로 타임 스탬프가있는 SNAPSHOTS를 사용해야하는 것 같습니다. 특히 내부적으로 maven 3을 사용하는 m2eclipse는 영향을받는 것으로 보이며 SNAPSHOTS가 고유하지 않으면 업데이트-스냅 샷이 작동하지 않습니다.
모든 스냅 샷을 uniqueVersion = false로 설정 하기 전에는 모범 사례 처럼 보였습니다.
이제는 타임 스탬프 버전으로 전환하는 것이 큰 문제가 아닌 것 같습니다. 결국 정기적으로 오래된 스냅 샷을 삭제할 수있는 중앙 넥서스 저장소에 의해 관리되기 때문입니다.
문제는 로컬 개발자 워크 스테이션입니다. 그들의 로컬 저장소 는 고유 한 스냅 샷으로 빠르게 매우 커집니다.
이 문제를 처리하는 방법?
지금 나는 다음과 같은 가능한 해결책을 봅니다.
- 개발자에게 정기적으로 저장소를 제거하도록 요청하십시오 (삭제하는 데 오랜 시간이 걸리고 필요한 모든 것을 다운로드하는 데 더 오랜 시간이 걸리기 때문에 많은 좌절로 이어집니다)
- 로컬 저장소에서 모든 SNAPSHOT 디렉토리를 삭제하는 스크립트를 설정하고 개발자에게 때때로 해당 스크립트를 실행하도록 요청합니다 (첫 번째 것보다 더 좋지만 현재 스냅 샷을 실행하고 다운로드하는 데는 여전히 상당한 시간이 걸립니다).
- dependency : purge-local-repository 플러그인 사용 (파일이 열려 있으므로 Eclipse에서 실행할 때 문제가 있으며 각 프로젝트에서 실행해야 함)
- 모든 워크 스테이션에 nexus를 설정하고 오래된 스냅 샷을 정리하는 작업을 설정합니다 (최상의 결과이지만 50 개 이상의 nexus 서버를 유지하고 싶지 않으며 개발자 워크 스테이션에서는 메모리가 항상 부족함)
- SNAPSHOTS 사용 중지
로컬 저장소가 하드 드라이브 공간을 채우는 것을 방지하는 가장 좋은 방법은 무엇입니까?
최신 정보:
동작을 확인하고 더 많은 정보를 제공하기 위해 작은 넥서스 서버를 설정하고 두 개의 프로젝트 (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>
비:
<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
로컬 저장소에서. 배포 대상을 실행할 때마다 새 타임 스탬프 버전을 사용합니다. 넥서스 서버에서 스냅 샷을 업데이트하려고 할 때도 마찬가지입니다 ( "a"프로젝트를 닫고 로컬 저장소에서 삭제하고 "b"를 빌드).
많은 스냅 샷이 빌드되는 환경 (허드슨 서버를 생각해보세요 ...)에서 로컬 리포지토리가 이전 버전으로 빠르게 채워집니다.
업데이트 2 :
이것이 실패하는 방법과 이유를 테스트하기 위해 더 많은 테스트를 수행했습니다. 각 테스트는 깨끗한 모든 항목에 대해 실행됩니다 (de / glauche는 시스템과 넥서스 모두에서 삭제됨)
- maven 2.2.1로 mvn 배포 :
시스템 A의 로컬 저장소에 snapshot.jar + snapshot-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 (embedded m3 final)에서 업데이트 종속성 (시스템 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 (embedded m3 final)에서 업데이트 종속성 (시스템 B에서) 실행-> 로컬 저장소에 snapshot.jar + snapshot-timestamp.jar 포함 :(
외부 maven 2.2.1로 패키지 목표 실행-> 로컬 저장소에 snapshot.jar + snapshot-timestamp.jar 포함 :(
요약하자면, maven3의 "배포"목표는 2.2.1보다 더 잘 작동하며, 생성하는 머신의 로컬 저장소는 괜찮아 보입니다. 그러나 수신자는 항상 많은 타임 스탬프 버전으로 끝납니다 ...
내가 도대체 뭘 잘못하고있는 겁니까 ?
업데이트 3
나는 또한 다양한 다른 구성을 테스트했고 먼저 nexus를 인공물-> 동일한 동작으로 대체했습니다. 그런 다음 linux maven 3 클라이언트를 사용하여 저장소 관리자에서 스냅 샷을 다운로드합니다.-> 로컬 저장소에는 여전히 타임 스탬프 스냅 샷이 있습니다.