89 Stimmen

Wie kann man mit Maven-3 zeitgestempelten Snapshots effizient umgehen?

Nun, da maven-3 die Tropfenabstützung für die <uniqueVersion>false</uniqueVersion> für Snapshot Artefakte scheint es, dass Sie wirklich zeitgestempelte SNAPSHOTS verwenden müssen. Speziell m2eclipse, welches maven 3 intern verwendet, scheint davon betroffen zu sein, update-snapshots funktioniert nicht, wenn die SNAPSHOTS nicht eindeutig sind.

Es schien das Beste zu sein vorher üben um alle Schnappschüsse auf uniqueVersion=false zu setzen

Nun scheint es kein großes Problem zu sein, auf die zeitgestempelte Version umzusteigen, schließlich werden sie von einem zentralen Nexus-Repository verwaltet, das in der Lage ist, alte Snapshots in regelmäßigen Abständen zu löschen.

Das Problem sind die lokalen Entwickler-Workstations. Ihr lokales Repository wächst schnell sehr groß mit einzigartigen Schnappschüssen.

Wie kann man mit diesem Problem umgehen?

Im Moment sehe ich die folgenden möglichen Lösungen:

  • Bitten Sie die Entwickler, das Repository in regelmäßigen Abständen zu bereinigen (was zu viel Frustration führt, da es lange dauert, alles zu löschen und noch länger, alles herunterzuladen, was benötigt wird)
  • Ein Skript einrichten, das alle SNAPSHOT Verzeichnisse aus dem lokalen Repository und bitten Sie die Entwickler, dieses Skript von Zeit zu Zeit auszuführen (besser als das erste, aber es dauert immer noch ziemlich lange, bis es ausgeführt und aktuelle Snapshots heruntergeladen sind)
  • Verwenden Sie das Plugin dependency:purge-local-repository (hat Probleme, wenn es von Eclipse aus ausgeführt wird, wegen offener Dateien, muss von jedem Projekt aus ausgeführt werden)
  • nexus auf jeder Workstation einrichten und einen Job zum Bereinigen alter Snapshots einrichten (bestes Ergebnis, aber ich möchte nicht 50+ nexus-Server verwalten, außerdem ist der Speicher auf den Entwickler-Workstations immer knapp)
  • SNAPSHOTS überhaupt nicht mehr verwenden

Wie lässt sich am besten verhindern, dass Ihr lokales Repository den Festplattenspeicher füllt?

Aktualisierung:

Um das Verhalten zu überprüfen und mehr Informationen zu erhalten, habe ich einen kleinen Nexus-Server eingerichtet, zwei Projekte (a und b) erstellt und ausprobiert:

a:

<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 nun Maven verwende 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, wird eine neue Version mit Zeitstempel erstellt. Dasselbe passiert, wenn ich versuche, Snapshots vom Nexus-Server zu aktualisieren (Projekt "a" schließen, aus dem lokalen Repository löschen, "b" erstellen).

In einer Umgebung, in der viele Snapshots erstellt werden (z.B. Hudson Server ...), füllt sich das lokale Reposioty mit alten Versionen schnell

Update 2:

Um herauszufinden, wie und warum dies scheitert, habe ich einige weitere Tests durchgeführt. Jeder Test ist gegen saubere alles laufen (de/glauche wird von beiden Maschinen und Nexus löschen)

  • mvn deploy mit maven 2.2.1 :

Das lokale Repository auf Rechner A enthält snapshot.jar + snapshot-timestamp.jar

ABER: nur ein mit einem Zeitstempel versehenes Gefäß in Nexus, Metadaten lesen:

<?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>
  • Update-Abhängigkeiten (auf Rechner B) in m2eclipse ausführen (eingebettetes m3 final) -> lokales Repository hat snapshot.jar + snapshot-timestamp.jar :(
  • Paketziel mit externem Maven 2.2.1 ausführen -> lokales Repository hat snapshot.jar + snapshot-timestamp.jar :(

Ok, nächster Versuch mit Maven 3.0.1 (nachdem alle Spuren von Projekt a entfernt wurden)

  • lokales Repository auf Rechner A sieht besser aus, nur ein einziges nicht zeitgestempeltes jar

  • nur ein zeitgestempeltes Glas in Nexus, Metadaten werden gelesen:

    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>
  • Update-Abhängigkeiten (auf Rechner B) in m2eclipse ausführen (eingebettetes m3 final) -> lokales Repository hat snapshot.jar + snapshot-timestamp.jar :(

  • Paketziel mit externem Maven 2.2.1 ausführen -> lokales Repository hat snapshot.jar + snapshot-timestamp.jar :(

Also, um es noch einmal zusammenzufassen: Das "deploy"-Ziel in maven3 funktioniert besser als in 2.2.1, das lokale Repository auf dem erstellenden Rechner sieht gut aus. Aber der Empfänger hat am Ende immer viele Versionen mit Zeitstempel ...

Was mache ich falsch?

Aktualisierung 3

Ich habe auch verschiedene andere Konfigurationen getestet, zuerst nexus durch artifactory ersetzen -> gleiches Verhalten. Dann verwende ich Linux Maven 3 Clients, um die Snapshots vom Repository Manager herunterzuladen -> das lokale Repository hat immer noch zeitgestempelte Snapshots :(

0 Stimmen

Ähnliche Frage, nur zu den lokalen .m2 \repository Teil, der sich auf das lokale Repository auf einem (Jenkins-)Build-Server konzentriert: stackoverflow.com/q/9729076/223837 .

0 Stimmen

Hier ist ein funktionierender Link zu den Apcahe Maven Comptability Notes - cwiki.apache.org/confluence/display/MAVEN/

0voto

vaquar khan Punkte 9331

Fügen Sie folgende Parameter in Ihre POM-Datei ein

POM

<configuration>
<outputAbsoluteArtifactFilename>true</outputAbsoluteArtifactFilename>
</configuration>

https://maven.apache.org/plugins/maven-dependency-plugin/copy-mojo.html

POM-Beispiel

<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>

In Jenkins konfigurieren:

// copy artifact 
copyMavenArtifact(artifact: "commons-collections:commons-collections:3.2.2:jar", outputAbsoluteArtifactFilename: "${pwd()}/target/my-folder/commons-collections.jar")

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X