Fehlende Abhängigkeiten bei mvn clean in Maven Multi-Modul-Projekt

06.03.2018

In einem Maven-Projekt mit mehreren Modulen hatte ich kürzlich dass Problem, dass unter bestimmten Umständen die Ausführung des Befehls mvn clean fehlschlug. Laut Fehlermeldung konnten gewisse Dependencies nicht aufgelöst werden:

[ERROR] Failed to execute goal on project myproject: Could not resolve dependencies for 
  project myproject:module-one:war:1.2.0-SNAPSHOT: The following artifacts could not be resolved: 
  myproject:module-two:jar:1.2.0-SNAPSHOT

Bei den Dependencies aus der Fehlermeldung handelte es sich um Module des Projekts, das mit clean gesäubert werden sollte. Der Fehler trat während der Ausführung von clean in module-one auf, das wiederum module-two als Abhängigkeit hat.

Voraussetzung für den Fehler war, dass die genannten Module noch nie mit mvn install gebaut worden waren, d.h. die Module sich noch nicht im lokalen Maven-Repository befanden. Das kommt beispielsweise vor nachdem die Versionsnummer  geändert wurde, oder wenn das Projekt noch gar nie gebaut worden ist.

Nun sollte man denken, dass bei einem mvn clean die Abhängigkeiten keine Rolle spielen. Tun sie in der Regel auch nicht. Wie sich jedoch herausstellte, gab es in module-one eine Konfiguration des maven-antrun-plugin, die an die clean-Phase gebunden war (Zeile 8):

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-antrun-plugin</artifactId>
      <executions>
        <execution>
          <phase>clean</phase>
          <configuration>
          ...
          </configuration>
          <goals>
            <goal>run</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

Beim Ausführen von mvn clean wurde also nicht nur das Projekt aufgeräumt, sondern auch das maven-antrun-plugin ausgeführt. Das Plugin setzt wiederum das Vorhandensein aller Abhängigkeiten des Moduls voraus.

Die Lösung war, das Antrun-Plugin an eine andere Phase zu binden. Wieso es an der clean-Phase hing konnte ich nicht mehr herausfinden (der Kollege von dem die Konfiguration stammte hatte das Unternehmen mittlerweile verlassen). Jedenfalls bietet der Maven Default Lifecycle eine große Auswahl an alternativen Phasen: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy.

Nach Auswahl und Konfiguration einer Phase die zum ausgeführten Ant-Task passt (in diesem Fall process-sources) lief der mvn clean-Befehl fehlerfrei durch.

Zurück zur Übersicht

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*Pflichtfelder

*