Layer 8Ehrlicher Tech-Support

Maven: Release 1.0 überschrieben, alle bauen mit der alten

Release 1.0 überschrieben, alle bauen weiter mit der alten: Maven lädt eine Release-Version nur, wenn sie lokal fehlt. Auch mvn -U hilft nicht.

Aufwand:
ca. 15 Min.
Voraussetzung:
Maven CLI, Lokales Repository unter ~/.m2/repository, Repository-Manager des Teams, Maven-Dokumentation zu Repositories, SNAPSHOT und CLI-Optionen
Gilt für:
Apache Maven (Introduction to Repositories, Getting Started Guide und CLI-Referenz 3.9.9 in der am 2026-10-15 abrufbaren Fassung)

Das Symptom

Ein Team findet einen Fehler in seiner Bibliothek 1.0, behebt ihn und lädt das Artefakt unter derselben Version 1.0 erneut ins Firmen-Repository hoch, weil die Version ja noch keiner benutzt hat. Danach bauen die Kollegen weiter mit der fehlerhaften Fassung, der CI-Server auch, und nur der eine Rechner, der die alte nie geladen hatte, hat den Fix. Wochen später gibt es zwei verschiedene Dateien mit derselben Koordinate im Umlauf, und niemand kann sagen, welche wo läuft. Dieselbe Fehlannahme in Gegenrichtung: Für eine SNAPSHOT-Abhängigkeit wird ein Cache-Problem vermutet, weil sie sich beim nächsten Build plötzlich ändert.

Die „Layer 8“-Wahrheit

Die Maven-Dokumentation zu Repositories beschreibt, wann überhaupt heruntergeladen wird: „Downloading in Maven is triggered by a project declaring a dependency that is not present in the local repository (or for a SNAPSHOT, when the remote repository contains one that is newer).“ Eine Release-Version, die einmal unter ~/.m2/repository liegt, wird also nie wieder angefragt. Das ist kein Versäumnis, sondern der Vertrag, den der Getting-Started-Guide ausspricht: „The SNAPSHOT value refers to the ‘latest’ code along a development branch, and provides no guarantee the code is stable or unchanging. Conversely, the code in a ‘release’ version (any version value without the suffix SNAPSHOT) is unchanging.“

Wer ein Release überschreibt, verletzt diesen Vertrag, und Maven kann das gar nicht bemerken, weil es auf der Abrufseite nie nachsieht. Auch der Schalter, der angeblich alles frisch holt, tut es nicht: Die CLI-Referenz beschreibt -U, –update-snapshots als „Forces a check for missing releases and updated snapshots on remote repositories“. Fehlende Releases und aktualisierte Snapshots; ein vorhandenes Release fehlt nicht und wird nicht neu geladen.

Richtig ist: Der Fix wird als 1.0.1 veröffentlicht; wer laufend ändern will, arbeitet mit 1.1-SNAPSHOT, denn nur dafür prüft Maven auf neuere Fassungen. Repository-Manager erlauben es deshalb in der Grundeinstellung nicht, ein Release zu überschreiben, und diese Sperre ist der einzige Ort, an dem der Vertrag technisch durchgesetzt wird. Wo er schon verletzt wurde, hilft nur das Löschen des Artefaktverzeichnisses im lokalen Repository auf jedem Rechner und jedem CI-Server, gefolgt von einer neuen Versionsnummer, damit es das letzte Mal war.

Die Gegenrichtung des Irrtums ist derselbe Vertrag von der anderen Seite: Eine SNAPSHOT-Abhängigkeit, die sich zwischen zwei Builds ändert, verhält sich genau so, wie der Guide es beschreibt. Wer dort Stabilität erwartet, hat die falsche Versionsart gewählt, nicht einen Fehler gefunden.

Die echte, verifizierte Lösung

1000 % faktenbasiert. Jeder Befehl ist real, jeder Pfad existiert. Schritt für Schritt:

  1. 1.

    Ein veröffentlichtes Release nie überschreiben

    Jeder Fix bekommt eine neue Versionsnummer, 1.0.1 oder 1.1. Das kostet nichts und hält den Vertrag ein, auf den jeder Rechner im Team baut: Eine Release-Version ist unveränderlich. Die Vorstellung, die Version habe ja noch keiner benutzt, ist in dem Moment falsch, in dem ein CI-Server oder ein Kollege einmal gebaut hat.

  2. 2.

    Für laufende Entwicklung SNAPSHOT verwenden

    Wer eine Bibliothek fortlaufend ändert und die Änderungen sofort bei anderen sehen will, arbeitet mit x.y-SNAPSHOT. Nur dafür prüft Maven, ob das entfernte Repository eine neuere Fassung enthält. Das ist auch die Antwort auf die Gegenrichtung des Irrtums: Eine SNAPSHOT-Abhängigkeit, die sich beim nächsten Build ändert, ist kein Cache-Problem, sondern das vorgesehene Verhalten.

  3. 3.

    Nach einem Überschreiben das lokale Repository bereinigen

    Das Verzeichnis des betroffenen Artefakts unter ~/.m2/repository löschen, auf jedem Entwicklerrechner und auf jedem CI-Server, und neu bauen. Erst dann ist sicher, dass überall dieselbe Datei liegt. Danach die neue Versionsnummer vergeben, damit es nicht wieder nötig wird.

    rm -rf ~/.m2/repository/com/example/bibliothek/1.0
    mvn -U clean verify
    
  4. 4.

    Das Überschreiben im Repository-Manager gesperrt lassen

    Repository-Manager unterscheiden Release- und Snapshot-Repositories und lassen das erneute Hochladen einer Release-Version in der Grundeinstellung nicht zu. Diese Sperre nicht abschalten, auch nicht einmalig. Sie ist der einzige Ort, an dem der Vertrag technisch durchgesetzt wird; Maven selbst kann es auf der Seite des Abrufs nicht.

Häufige Fragen (FAQ)

?Wir haben 1.0 neu hochgeladen. Warum bauen die Kollegen weiter mit der alten Datei?

Weil Maven eine Release-Version nur einmal lädt. Die Dokumentation zu Repositories sagt: „Downloading in Maven is triggered by a project declaring a dependency that is not present in the local repository (or for a SNAPSHOT, when the remote repository contains one that is newer).“ Wer 1.0 schon einmal geladen hat, hat sie unter ~/.m2/repository, und ab dann wird sie nicht mehr angefragt. Nur der Rechner, der die alte Datei nie hatte, bekommt die neue. Genau so entstehen zwei verschiedene Dateien mit derselben Koordinate.

?Ist das nicht ein Fehler von Maven?

Nein, es ist der Vertrag. Der Getting-Started-Guide erklärt den Unterschied: „The SNAPSHOT value refers to the ‘latest’ code along a development branch, and provides no guarantee the code is stable or unchanging. Conversely, the code in a ‘release’ version (any version value without the suffix SNAPSHOT) is unchanging.“ Eine Release-Version ist per Definition unveränderlich; deshalb darf Maven sie lokal behalten, ohne je nachzufragen. Wer sie überschreibt, verletzt den Vertrag, und Maven kann das gar nicht bemerken.

?Holt mvn -U nicht alles frisch?

Nein. Die CLI-Referenz beschreibt -U, --update-snapshots knapp: „Forces a check for missing releases and updated snapshots on remote repositories“. Geprüft wird auf fehlende Releases und aktualisierte Snapshots. Ein Release, das lokal vorhanden ist, fehlt nicht, also wird es nicht neu geladen. Der Schalter hilft bei Snapshots, die sich geändert haben, und bei Releases, die beim letzten Versuch nicht erreichbar waren, nicht bei einem überschriebenen Release.

?Was tun, wenn es schon passiert ist?

Den Fix unter einer neuen Version veröffentlichen, etwa 1.0.1, und alle Projekte darauf umstellen. Das überschriebene 1.0 bleibt als Warnung stehen: Wer es lokal hat, hat eine von zwei Fassungen, und niemand kann sagen, welche. Wo das nicht reicht, muss das Verzeichnis des Artefakts unter ~/.m2/repository auf jedem Rechner und jedem CI-Server gelöscht werden, damit der nächste Build es neu lädt; -U erledigt das nicht.

Belege

Diese Seite ist gegen die folgenden Primärquellen geprüft – Hersteller, Standard oder Gesetzestext. Wer es nicht glaubt, muss es nicht: Da steht, wo es nachzulesen ist.

Zuletzt geprüft am . Dokumentation altert – ein Datum daneben ist der einzige ehrliche Umgang damit.

Auch zu finden unter

Verwandte Fehler

SWLästigCould not resolve dependencies

Maven: Could not resolve dependencies

Maven findet eine Abhängigkeit nicht? Meist fehlt das Repository, ein Proxy blockt, oder ein halb geladenes Paket verstopft den Cache.