Nachdem maven-3 die Unterstützung für die <uniqueVersion> false </ einzigartigVersion> für Snapshot-Artefakte eingestellt hat, müssen Sie anscheinend wirklich zeitgestempelte SNAPSHOTS verwenden. Insbesondere m2eclipse, das intern maven 3 verwendet, scheint davon betroffen zu sein. Update-Snapshots funktionieren nicht, wenn die SNAPSHOTS nicht eindeutig sind.
Es schien am besten Praxis , bevor alle Snapshots zu uniqueVersion = false gesetzt
Jetzt scheint es kein großes Problem zu sein, auf die zeitgestempelte Version zu wechseln, schließlich werden sie von einem zentralen Nexus-Repository verwaltet, das in der Lage ist, alte Schnappschüsse in regelmäßigen Intervallen zu löschen.
Das Problem sind die lokalen Entwicklerarbeitsplätze. Ihr lokales Repository wird mit einzigartigen Snapshots schnell sehr groß.
Wie gehe ich mit diesem Problem um?
Im Moment sehe ich die folgenden möglichen Lösungen:
- Bitten Sie die Entwickler, das Repository in regelmäßigen Abständen zu löschen (was zu großer Aufregung führt, da das Löschen und das Herunterladen aller benötigten Dateien lange dauert).
- Richten Sie ein Skript ein, das alle SNAPSHOT- Verzeichnisse aus dem lokalen Repository löscht, und bitten Sie die Entwickler, dieses Skript von Zeit zu Zeit auszuführen (besser als das erste, aber das Ausführen und Herunterladen aktueller Snapshots dauert noch einige Zeit).
- Verwenden Sie das Plugin für die Abhängigkeit: purge-local-repository (Hat Probleme beim Ausführen von Eclipse, da geöffnete Dateien von jedem Projekt ausgeführt werden müssen).
- Richten Sie Nexus auf jeder Workstation ein und richten Sie einen Job zum Bereinigen alter Snapshots ein (bestes Ergebnis, aber ich möchte nicht mehr als 50 Nexus-Server warten, und der Speicher auf Entwickler-Workstations ist immer knapp).
- Verwenden Sie SNAPSHOTS überhaupt nicht mehr
Was ist der beste Weg, um zu verhindern, dass Ihr lokales Repository Ihren Festplattenspeicher ausfüllt?
Aktualisieren:
Um das Verhalten zu überprüfen und weitere Informationen zu geben, richte ich einen kleinen Nexus-Server ein, erstelle zwei Projekte (a und b) und versuche:
ein:
<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>
Wenn ich jetzt maven benutze und "deploy" auf "a" ausführe, habe ich
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
im lokalen Repository. Jedes Mal, wenn ich das Bereitstellungsziel ausführe, mit einer neuen Zeitstempelversion. Das gleiche passiert, wenn ich versuche, Snapshots vom Nexus-Server zu aktualisieren ("a" -Projekt schließen, aus dem lokalen Repository löschen, "b" erstellen)
In einer Umgebung, in der viele Schnappschüsse erstellt werden (denken Sie an Hudson Server ...), füllt sich das lokale Reposioty schnell mit alten Versionen
Update 2:
Um zu testen, wie und warum dies fehlschlägt, habe ich weitere Tests durchgeführt. Jeder Test wird gegen alles sauber ausgeführt (de / glauche wird sowohl von den Maschinen als auch vom Nexus gelöscht)
- MVN-Bereitstellung mit Maven 2.2.1:
Das lokale Repository auf Computer A enthält snapshot.jar + snapshot-timestamp.jar
ABER: Nur ein Glas mit Zeitstempel im Nexus, Metadaten lauten:
<?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>
- Führen Sie Update-Abhängigkeiten (auf Computer B) in m2eclipse (Embedded M3 Final) aus. -> Das lokale Repository verfügt über snapshot.jar + snapshot-timestamp.jar :(
- Paketziel mit externem Maven ausführen 2.2.1 -> Das lokale Repository hat snapshot.jar + snapshot-timestamp.jar :(
Ok, nächster Versuch mit Maven 3.0.1 (nachdem alle Spuren von Projekt a entfernt wurden)
Das lokale Repository auf Maschine A sieht besser aus, nur ein Glas ohne Zeitstempel
Nur ein Glas mit Zeitstempel im Nexus, Metadaten lauten:
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>
Führen Sie Update-Abhängigkeiten (auf Computer B) in m2eclipse (Embedded M3 Final) aus. -> Das lokale Repository verfügt über snapshot.jar + snapshot-timestamp.jar :(
Paketziel mit externem Maven ausführen 2.2.1 -> Das lokale Repository hat snapshot.jar + snapshot-timestamp.jar :(
Um es noch einmal zusammenzufassen: Das Ziel "Bereitstellen" in maven3 funktioniert besser als in 2.2.1. Das lokale Repository auf dem Erstellungscomputer sieht gut aus. Aber der Empfänger hat immer viele zeitgesteuerte Versionen ...
Was mache ich falsch ?
Update 3
Ich habe auch verschiedene andere Konfigurationen getestet und zuerst den Nexus durch künstliches -> gleiches Verhalten ersetzt. Verwenden Sie dann Linux Maven 3-Clients, um die Snapshots vom Repository-Manager herunterzuladen -> Das lokale Repository verfügt weiterhin über Snapshots mit Zeitstempel :(