2015-04-18 36 views
19

Podczas uruchamiania poleceń takich jakMaven nie można rozwiązać zależności dla modułu w samym projekcie wielomodułowego

mvn dependency:build-classpath 

lub

mvn exec:java 

Maven nie jest w stanie rozwiązać problem uzależnienia od jednego z moich modułów na innym.

[ERROR] Nie udało się zrealizować cel na projekt parsera-app: Nie można rozwiązać problemów z zależnościami dla project_group projektu: A: słoik: 0,1-SNAPSHOT: Nie można odnaleźć artefakt project_group: B: słoik: 0,1-SNAPSHOT

struktura projektu jest następujący:

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

POM rodzic jest w następujący sposó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/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> 

Pierwszy moduł dziecko (jeden braku rozwiązać zależność):

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

Drugi moduł dziecko (zależność):

<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 zamiany struktury budowlanej, to znaczy przepisać pom.xml mieć b. klasy w module A wymaga klas z modułu B, następnie B musi zostać zbudowany najpierw –

+1

bez zmian, o ile wiedziałem, że reaktor powinien opracować zlecenie z zależności –

+0

Popraw reaktor powinien obsługiwać kolejność zabudowy. Nie potrzeba żadnych manuall handling ani nie powinno się tego robić. – khmarbaise

Odpowiedz

28

masz uruchomić mvn clean install przynajmniej raz nad projektem zainstalować zależności w lokalnym repozytorium?

+1

To zadziałało. Oznacza to, że muszę uruchomić instalację za każdym razem, gdy zaktualizuję moduł zależny? Zakładam, że był sposób, aby użyć ostatnio zbudowanej kopii (np. Root/B/target/B-0.1-SNAPSHOT.jar). –

+0

Myślę, że to, czego szukasz, to: http: // stackoverflow.com/questions/4367665/java-maven-rebuild-dependency Większość metod jest mniej udokumentowana, ponieważ maven opiera się na modelu zależności, w którym zależności są instalowane w lokalnym repozytorium –

+1

Mogę pakiet mvn i mam pakiety budują się nawzajem, jednak założyłem, że inne działania (takie jak generowanie ścieżki klasy lub wykonywania) będą również używać ostatnio zbudowanych pakietów, a nie tych, które zainstalowałem ostatnio w lokalnym repozytorium. Zgaduję, że to może być kompromis, z którym muszę żyć? –

8

Reaktor Maven jest dziwny w ten sposób, utrzymuje moduły tylko dla niektórych zadań. Kiedy uruchamiasz obiekt kompilacji, który robi coś tylko dla jednego podprojektu, wtedy, jeśli Maven najpierw zbuduje zależności, nie zatrzyma ich w reaktorze (czasami).

Zainstalowanie w lokalnym repozytorium jest obejściem problemu, ale jest okropne i należy go unikać, jeśli jest to możliwe, ponieważ łatwo można uzyskać nieaktualne wyniki kompilacji.

Nieco mniej brzydkim rozwiązaniem jest połączenie dwóch obiektów konstrukcyjnych, w których drugi cel budowania robi coś nieszkodliwego, ale uruchamia dodatek do reaktora we wszystkich podprojektach.

Jako przykład można połączyć wybrane zadanie z zadaniami "kompiluj" lub "pakietuj".

zobaczyć również najwyższe głosowało odpowiedź na Maven doesn't recognize sibling modules when running mvn dependency:tree