Sekarang setelah maven-3 memberikan dukungan untuk <uniqueVersion> false </uniqueVersion> untuk artefak snapshot, tampaknya Anda benar-benar perlu menggunakan SNAPSHOTS yang diberi stempel waktu. Terutama m2eclipse, yang menggunakan maven 3 secara internal tampaknya terpengaruh dengannya, update-snapshot tidak berfungsi jika SNAPSHOTS tidak unik.
Tampaknya praktik terbaik sebelum menyetel semua snapshot ke uniqueVersion = false
Sekarang, tampaknya tidak ada masalah besar untuk beralih ke versi timestamped, bagaimanapun juga mereka dikelola oleh repositori nexus pusat, yang mampu menghapus snapshot lama di intervalls biasa.
Masalahnya adalah workstation pengembang lokal. Repositori lokal mereka dengan cepat tumbuh sangat besar dengan snapshot unik.
Bagaimana cara mengatasi masalah ini?
Sekarang saya melihat kemungkinan solusi berikut:
- Minta pengembang untuk membersihkan repositori secara berkala (yang menyebabkan banyak fustration, karena butuh waktu lama untuk menghapus dan bahkan lebih lama untuk mengunduh semua yang diperlukan)
- Siapkan beberapa skrip yang menghapus semua direktori SNAPSHOT dari repositori lokal dan minta pengembang untuk menjalankan skrip itu dari waktu ke waktu (lebih baik dari yang pertama, tetapi masih membutuhkan waktu untuk menjalankan dan mengunduh snapshot saat ini)
- gunakan dependensi: plugin purge-local-repository (Apakah mengalami masalah saat dijalankan dari eclipse, karena file yang terbuka, perlu dijalankan dari setiap proyek)
- mengatur nexus di setiap workstation dan mengatur pekerjaan untuk membersihkan snapshot lama (hasil terbaik, tetapi saya tidak ingin mempertahankan 50+ server nexus, ditambah memori selalu ketat pada workstation pengembang)
- berhenti menggunakan SNAPSHOTS sama sekali
Apa cara terbaik untuk mencegah repositori lokal Anda mengisi ruang hard drive Anda?
Memperbarui:
Untuk memverifikasi perilaku dan untuk memberikan info lebih lanjut, saya menyiapkan server nexus kecil, membangun dua proyek (a dan b) dan mencoba:
Sebuah:
<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>
Sekarang, ketika saya menggunakan maven dan menjalankan "deploy" pada "a", saya akan melakukannya
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
di repositori lokal. Dengan versi stempel waktu baru setiap kali saya menjalankan target penerapan. Hal yang sama terjadi ketika saya mencoba memperbarui Snapshot dari server nexus (tutup Project "a", hapus dari repositori lokal, build "b")
Dalam lingkungan di mana banyak snapshot dibangun (pikirkan server hudson ...), reposioty lokal terisi dengan versi lama dengan cepat
Perbarui 2:
Untuk menguji bagaimana dan mengapa ini gagal, saya melakukan beberapa tes lagi. Setiap pengujian dijalankan terhadap semua yang bersih (de / glauche dihapus dari mesin dan nexus)
- mvn menyebarkan dengan maven 2.2.1:
repositori lokal pada mesin A memang berisi snapshot.jar + snapshot-timestamp.jar
TAPI: hanya satu botol dengan stempel waktu di nexus, metadata terbaca:
<?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>
- jalankan dependensi pembaruan (pada mesin B) di m2eclipse (m3 final tertanam) -> repositori lokal memiliki snapshot.jar + snapshot-timestamp.jar :(
- menjalankan tujuan paket dengan maven 2.2.1 eksternal -> repositori lokal memiliki snapshot.jar + snapshot-timestamp.jar :(
Ok, selanjutnya coba dengan maven 3.0.1 (setelah menghapus semua jejak proyek a)
repositori lokal pada mesin A terlihat lebih baik, hanya satu botol non-timestamped
hanya satu botol dengan stempel waktu di nexus, metadata berbunyi:
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>
jalankan dependensi pembaruan (pada mesin B) di m2eclipse (m3 final tertanam) -> repositori lokal memiliki snapshot.jar + snapshot-timestamp.jar :(
menjalankan tujuan paket dengan maven 2.2.1 eksternal -> repositori lokal memiliki snapshot.jar + snapshot-timestamp.jar :(
Jadi, untuk rekap: Tujuan "menyebarkan" di maven3 bekerja lebih baik daripada di 2.2.1, repositori lokal pada mesin pembuat terlihat baik-baik saja. Namun, receiver selalu mendapatkan banyak versi dengan waktu ...
Apa yang saya lakukan salah?
Perbarui 3
Saya juga menguji berbagai konfigurasi lain, pertama-tama ganti nexus dengan artifactory -> perilaku yang sama. Kemudian gunakan klien linux maven 3 untuk mengunduh snapshot dari manajer repositori -> repositori lokal masih memiliki snapshot yang diberi stempel waktu :(