2015-04-18 3 views
19

lösen Wenn Befehle wieMaven kann keine Abhängigkeit für das Modul in derselben Multi-Modul-Projekt

mvn dependency:build-classpath 

oder

mvn exec:java 

Maven läuft nicht in der Lage, eine Abhängigkeit von einem meiner Module auf einem anderen zu lösen.

[ERROR] Ziel auf Projekt-Parser-App auszuführen fehlgeschlagen: beheben kann nicht Abhängigkeiten für Projekt project_group: A: jar: 0.1-SNAPSHOT: B: jar: nicht Artefakt project_group finden kann 0,1-snapshot

Die Struktur Projekt ist wie folgt:

/pom.xml 
/A/pom.xml 
/B/pom.xml 

Die Mutter POM wie folgt ist:

<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/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>project_group</groupId> 
    <artifactId>parent</artifactId> 
    <packaging>pom</packaging> 
    <version>0.1-SNAPSHOT</version> 
    <name>parent</name> 

    <modules> 
    <module>A</module> 
    <module>B</module> 
    </modules> 

Das erste Kind Modul (die andernfalls die Abhängigkeit zu lösen):

<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/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
    <groupId>parent_group</groupId> 
    <artifactId>parent</artifactId> 
    <version>0.1-SNAPSHOT</version> 
    </parent> 
    <artifactId>A</artifactId> 
    <packaging>jar</packaging> 
    <name>A</name> 

    <dependencies> 
    <dependency> 
     <groupId>parent_group</groupId> 
     <artifactId>B</artifactId> 
     <version>0.1-SNAPSHOT</version> 
    </dependency> 

Das zweite Kind-Modul (die Abhängigkeit):

<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/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
    <groupId>parent_group</groupId> 
    <artifactId>parent</artifactId> 
    <version>0.1-SNAPSHOT</version> 
    </parent> 
    <artifactId>B</artifactId> 
    <packaging>jar</packaging> 
    <name>B</name> 
+0

try Vertauschen der Build-Struktur, meine ich Ihre pom.xml umschreiben B A zu haben. Klassen in Modul A benötigt Klassen von Modul B, dann B muss zuerst gebaut werden –

+1

keine Änderung, soweit ich wusste, der Reaktor sollte die Reihenfolge aus den Abhängigkeiten –

+0

Richtig den Reaktor sollte die Reihenfolge des Bauens umgehen. Keine manuelle Handhabung erforderlich, noch sollte es getan werden. – khmarbaise

Antwort

28

Haben Sie laufen mvn clean install mindestens einmal an dem Projekt Installieren Sie die Abhängigkeiten in Ihrem lokalen Repository?

+1

Das hat funktioniert. Das bedeutet, dass ich jedes Mal, wenn ich das abhängige Modul aktualisiere, die Installation ausführen muss? Ich nahm an, dass es eine Möglichkeit gab, die zuletzt erstellte Kopie zu verwenden (dh root/B/target/B-0.1-SNAPSHOT.jar) –

+0

Ich denke, was Sie suchen, ist dann: http: // stackoverflow.com/questions/4367665/java-maven-rebuild-dependency Die meisten Methoden, dies zu tun, sind jedoch weniger gut dokumentiert, wie Maven stützt sich auf das Abhängigkeitsmodell, wobei Ihre Abhängigkeiten im lokalen Repository installiert sind –

+1

Ich kann MVN-Paket und haben Die Pakete bauen gegeneinander, aber ich nahm an, dass andere Aktionen (wie das Generieren des Klassenpfads oder das Ausführen) auch die zuletzt erstellten Pakete verwenden, nicht das, was ich zuletzt in meinem lokalen Repository installiert habe. Ich vermute, das könnte nur ein Kompromiss sein, mit dem ich leben muss? –

8

Der Maven-Reaktor ist auf diese Weise seltsam, er hält Module nur für bestimmte Aufgaben bereit. Wenn ein Build-Ziel ausgeführt wird, das nur etwas für ein Teilprojekt tut, dann wenn Maven zuerst Abhängigkeiten baut, hält es sie nicht im Reaktor (manchmal).

Die Installation im lokalen Repository ist eine Problemumgehung, aber es ist schrecklich und sollte nach Möglichkeit vermieden werden, da Sie leicht veraltete Build-Ergebnisse erhalten.

Eine etwas weniger hässliche Problemumgehung ist, zwei Build-Ziele zu kombinieren, wobei das zweite Build-Ziel etwas Harmloses tut, aber in allen Teilprojekten zusätzlich zum Reaktor auslöst.

Als Beispiel können Sie die gewünschte Aufgabe mit den Aufgaben 'compile' oder 'package' kombinieren.

Siehe auch höchste Antwort stimmte bei Maven doesn't recognize sibling modules when running mvn dependency:tree