Problem mit Maven 3 Dependency Resolution

Im Zuge meiner Bachelorarbeit habe ich ein Projekt von Maven 2 nach Maven 3 migriert.
Dabei bin ich beim bauen des Projekts mit Maven 3 ein paar mal über eine etwas verwirrende Fehlermeldung gestolpert.

Das Problem:

Could not find artifact XXX in nexus.synyx.de (http://nexus.synyx.de)

…und das obwohl das Artefakt in der richtigen Version sowohl lokal als auch im Remote-Repository vorhanden ist.

Die Ursache:

It’s not a bug, it’s a feature!
Nach etwas Recherche hat sich dann herausgestellt, dass es  sich dabei um ein Maven-3-Feature handelt mit – sagen wir – unglücklich gewählter Fehlermeldung.
Seit Maven 3 merkt sich Maven in den _maven.repositories-Dateien für jedes Artefakt auch das Repo aus dem es runtergeladen wurde. Das stellt unter anderem sicher, dass auch wirklich das richtige Artefakt benutzt wird. Außerdem werden so auch nicht eingetragene Repositories aufgedeckt.
Allerdings  kann es durch die wenig aussagekräftige Fehlermeldung bei Benutzern leicht zur Verwirrung kommen.

Die Lösung:

Tritt dieses Probelm auf sollte man als erstes kontrollieren ob alle Repositories in der POM und der settings.xml richtig angegeben sind und dies dann gegebenenfalls nachholen.
Sollte die Fehlermeldung immer noch auftreten hilft ein:
cd ~/.m2/repository/PFAD/ZUM/ARTEFAKT/
rm _maven.repositories
Ein weiterer Grund die Datei zu löschen wäre wenn man z.B. explizit wünscht, dass das Artefakt aus dem lokalen Maven-Repository benutzt wird.
 

Kommentare

  1. Soweit ich das beurteilen kann: Nein.
    Identische Koordinaten bedeuten für Maven identische Artefakte, auch wenn diese sich unterscheiden - ein Vergleich anhand einer Prüfsumme findet nicht statt.
    Man findet zwar für jede Datei im Repository eine .md5 oder .sha1 Datei, die enthält aber nur den Wert der als erstes gedownloadeten Datei.
    Für alle Artefakte mit den gleichen Koordinaten die später aus anderen Repositories geholt werden (sollen) sagt Maven sich "Hey super! Artefakt schon vorhanden" und fügt der _maven.repositories-Datei jediglich die ID des neuen Repositories hinzu.

  2. Interessant! Kann man dann auch grundsätzlich 2 Artefakte mit den gleichen Koordinaten aus 2 Repos haben und es wird jeweils das richtige verwendet?