2009-11-04 22 views
66

Próbuję skonfigurować wielomodułowy projekt Maven, a zależności między modułami najwyraźniej nie są poprawnie skonfigurowane.Maven nie rozpoznaje modułów rodzeństwa podczas uruchamiania zależności mvn: drzewo

mam:

<modules> 
    <module>commons</module> 
    <module>storage</module> 
</modules> 

w POM macierzystego (który ma opakowanie typu POM) a następnie podkatalogów fotografia i/przechowywania /, które określają poms słoik z tej samej nazwie.

Przechowywanie zależy od Commons.

W głównym (master) katalogu, biegnę mvn zależność: drzewa i patrz:

[INFO] Building system 
[INFO] task-segment: [dependency:tree] 
[INFO] ------------------------------------------------------------------------ 
[INFO] [dependency:tree {execution: default-cli}] 
[INFO] domain:system:pom:1.0-SNAPSHOT 
[INFO] \- junit:junit:jar:3.8.1:test 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building commons 
[INFO] task-segment: [dependency:tree] 
[INFO] ------------------------------------------------------------------------ 
[INFO] [dependency:tree {execution: default-cli}] 
...correct tree... 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building storage 
[INFO] task-segment: [dependency:tree] 
[INFO] ------------------------------------------------------------------------ 
Downloading: http://my.repo/artifactory/repo/domain/commons/1.0-SNAPSHOT/commons-1.0-SNAPSHOT.jar 
[INFO] Unable to find resource 'domain:commons:jar:1.0-SNAPSHOT' in repository my.repo (http://my.repo/artifactory/repo) 
[INFO] ------------------------------------------------------------------------ 
[ERROR] BUILD ERROR 
[INFO] ------------------------------------------------------------------------ 
[INFO] Failed to resolve artifact. 

Missing: 
---------- 
1) domain:commons:jar:1.0-SNAPSHOT 

Dlaczego zależność od „commons” fail, mimo że reaktor ma oczywiście widziałem go, ponieważ z powodzeniem przetwarza jego drzewo zależności? To na pewno nie należy chodzić do „siatki, żeby go znaleźć, ponieważ właśnie tam ...

POM do przechowywania:

<?xml version="1.0" encoding="UTF-8"?> 
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <modelVersion>4.0.0</modelVersion> 
    <packaging>jar</packaging> 
    <parent> 
    <artifactId>system</artifactId> 
    <groupId>domain</groupId> 
    <version>1.0-SNAPSHOT</version> 
    </parent> 
    <groupId>domain</groupId> 
    <artifactId>storage</artifactId> 
    <name>storage</name> 
    <url>http://maven.apache.org</url> 
    <dependencies> 
    <!-- module dependencies --> 
    <dependency> 
     <groupId>domain</groupId> 
     <artifactId>commons</artifactId> 
     <version>1.0-SNAPSHOT</version> 
    </dependency> 

    <!-- other dependencies --> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    </dependencies> 
</project> 

Dzięki za wszelkie sugestie!

(Edit)

Aby wyjaśnić, co szukam tutaj jest taka: nie chcę mieć do zainstalowania modułu X zbudować moduł Y, która zależy od X, biorąc pod uwagę, że oba moduły są przywoływane z ten sam rodzic POM. W ten sposób intuicyjnie rozumiem, że jeśli mam dwie rzeczy w tym samym drzewie źródłowym, nie powinienem instalować produktów pośrednich, aby kontynuować kompilację. Mam nadzieję, że moje myślenie ma sens tutaj ...

+2

Ahhh, Edycja jest idealna. Dlaczego nie napisałeś tego w pierwszej intencji? Być może rozważ zmianę tytułu :) Nie chcę być wybredny, tylko ze względu na jasność i klasyfikację. Pomoże to całej społeczności w przyszłości podczas wyszukiwania podobnego problemu (który nie jest krystalicznie czysty z faktycznym tytułem i treścią, która dotyczy zależności: drzewo). –

+1

Witam. Czy znalazłeś rozwiązanie? Mam też ten problem :( –

+1

Czy kompilacja się nie udała, czy tylko zależność: cel drzewa sam? Patrz odpowiedź od Dona Willisa: – metamatt

Odpowiedz

14

Myślę, że problem polega na tym, że kiedy określasz zależność, Maven spodziewa się, że będzie to słoik (lub coś w tym rodzaju) zapakowany i dostępny od co najmniej lokalnego repozytorium. Jestem pewien, że jeśli uruchomisz mvn install na swoim wspólnym projekcie, wszystko będzie działać.

+1

Czy istnieje sposób, aby określić, że chcę, aby użyć dowolnej wersji modułu w drzewie źródłowym? Myślałem, że ten przypadek będzie obsługiwany automatycznie. nie chcę/nie sądzę, że Maven wymaga, aby zawsze budować-instalować-kompilować-instalować-kompilację za każdym razem, gdy chcę zrobić cały projekt! –

+17

Masz rację, że instalacja działa, ale teraz mam instalować za każdym razem, gdy wprowadzam zmiany, co nie jest tym, czego chcę.) Chcę, żeby projekt pamięci przechwycił ostatni kod z projektu commons –

+0

Tak naprawdę mam do czynienia z podobnymi problemami i niestety - nie jestem w stanie znajdź odpowiedź do tej pory. Wygląda na to, że Maven nie przejmuje się tym, że zależność jest powiązana z twoim modułem, po prostu od razu się odradza. Będę faworyzował twoje pytanie - może więc jakiś guru odpowie. Jestem zainteresowany, aby dowiedzieć się, czy można to zrobić. – Bostone

77

Jak omówiono w artykule this maven mailing list thread, zależność: cel drzewa samo w sobie będzie wyglądał lepiej w repozytorium niż w reaktorze. Można to obejść przez mvn instalowanie, jak wcześniej sugerowano, albo robi coś mniej uciążliwy, który wywołuje reaktor, taki jak

mvn compile dependency:tree 

pracuje dla mnie.

+0

Dziękujemy za to tanie obejście. Ale czy to błąd?Oczekuję zależności: cel drzewa zależy od reaktora bez żadnej sztuczki. – mcoolive

+0

Należy zauważyć, że taka sama sytuacja ma miejsce w przypadku każdego zadania uruchamianego globalnie, ale ma wpływ tylko na niektóre podprojekty. – tkruse

+0

Niestety, 'compile' wyzwala pobieranie tranzytowych zależności. Czy istnieje również sposób na wylistowanie drzewa zależności bez pobierania ich (oczywiście z wyjątkiem POM)? – sschuberth

8

Uświadamiając sobie, że jest to starszy wątek, ale wydaje się, że narzędzie ewoluowało lub mogło zostać pominięte za pierwszym razem.

Możliwe jest wykonanie kompilacji, która sprawia, że ​​zależności są rozwiązywane bez instalowania przez wykonanie kompilacji reaktora.

Po uruchomieniu kompilacji w obiekcie nadrzędnym opisującym strukturę modułu projektu, zależności między modułami zostaną rozwiązane podczas samej instalacji przez wewnętrzny reaktor Maven.

Oczywiście nie jest to idealne rozwiązanie, ponieważ nie rozwiązuje problemu budowy pojedynczego modułu w strukturze. W tym przypadku Maven nie będzie miał zależności w swoim reaktorze i będzie szukał rozwiązania w repozytorium. Więc w przypadku pojedynczych kompilacji musisz najpierw zainstalować zależności.

Oto niektóre z opisów tej sytuacji: reference.

+1

Czy istnieje sposób na zbudowanie pojedynczego modułu, bez instalowania zależności w pierwszej kolejności i bez budowania pełnego projektu nadrzędnego? –

+0

Aby ukończyć odpowiedź - jeśli wtyczka jest wywoływana bezpośrednio (bez faz), np. 'Zależność mvn: drzewo', nadal nie rozwiąże zależności od źródeł, chyba że wywołasz fazę' kompilacji'. Tak więc zamiast tego działałoby to: 'zależność mvn compile: tree'. –

3

dla mnie, co doprowadziło mnie do tego wątku był podobny problem, a rozwiązanie było zapewnienie wszystkie pom zależnościami moduł miał

<packaging>pom</packaging> 

jednostka dominująca

pom

moim modelu dep miał pom - więc nie można było znaleźć słoja.

+0

Który rzuca ten błąd dla mnie: Błąd parsowania czytanie POM. Powód: Nierozpoznany tag: "opakowanie" – hithwen

+0

edytuj: oznaczono pom naprawiono. zastępując słoik bsautner

+1

Rozwiązuje to problem opisany w pytaniu, ale teraz moduły podrzędne nie powodują eksportowania archiwów (np. słoiki, wojny, uszy). – sheldonh

2

Jedyną rzeczą, która workd dla mnie: przejście do Gradle :(

mam

Parent 
    +---dep1 
    +---war1 (using dep1) 

i mogę tylko cd w wojnę1 i użyć mvn tomcat7. Run-war zawsze mam aby przed zainstalowaniem cały projekt, mimo wojnę1 odwołuje jego rodziców i wojnę1 referencje rodzica i dep1 (jako moduły), więc wszystkie zależności powinny być znane.

nie rozumiem w czym jest problem.

+1

Dlatego używam gradle, gdy muszę utworzyć projekt wielomodułowy. :( –

0

Upewnij się, że moduł, który nie może zostać rozwiązany, wskazuje na prawą stronę nadrzędną, dołączając konfiguracje do pliku pom modułu.