2010-11-10 8 views
21

Mam maven wielomodułowy projekt.Jak sprawić, aby jeden moduł był zależny od innego artefaktu modułu?

A: parent. 
    B: child1. 
    C: child2. 

B zostanie spakowany, aby pobrać plik jar, a następnie c użyje tego pliku jar, aby skompilować kod.

w B, jeśli biegnę mvn package, to stworzy b.jar (pobyty w B/target/jars nie w B/target -dla innym celu).

W C, muszę użyć tego b.jar do kompilacji kodu.

Teraz, od A, kiedy biegnę: mvn package. Po pierwsze, udało mi się stworzyć plik b.jar dla B.

Ale kiedy dojdzie do fazy kompilacji C, wygląda na to, że C nie rozpoznaje b.jar w ścieżce klas (kompilacja dostaje błędy, ponieważ kod C nie może zaimportować klasy plik z B).

Moje pytanie brzmi: jak mogę rozwiązać ten problem?

---------- Below są POM pliki

A: pom.xml 
    <groupId>AAA</groupId> 
    <artifactId>A</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>pom</packaging> 

    <modules> 
    <module>C</module> 
    <module>B</module> 
    </modules> 

B: pom.xml 
     <groupId>AAA</groupId> 
<artifactId>B</artifactId> 
<packaging>jar</packaging> 
<version>0.0.1-SNAPSHOT</version> 
<parent> 
    <artifactId>A</artifactId> 
    <groupId>AAA</groupId> 
    <version>0.0.1-SNAPSHOT</version> 
</parent> 

C: pom.xml 
     <parent> 
    <artifactId>A</artifactId> 
    <groupId>AAA</groupId> 
    <version>0.0.1-SNAPSHOT</version> 
</parent> 

<groupId>AAA</groupId> 
<artifactId>C</artifactId> 
<packaging>war</packaging> 
<version>0.0.1-SNAPSHOT</version> 

<dependencies> 

    <dependency> 
    <groupId>AAA</groupId> 
    <artifactId>B</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    </dependency> 
.... 
+6

Tak jak najlepsza praktyka (niezwiązana z tym pytaniem), moduły B i C nie powinny deklarować własnego groupId i wersji; powinny je odziedziczyć po rodzicu (moduł A) POM. Nadal jednak muszą zadeklarować własne opakowanie i artefakt. –

Odpowiedz

14

Wyglada jak to powinno działać na mnie. Ale możesz spróbować mvn install zamiast mvn package.

+0

Dzięki. To dobry pomysł. Ale jeśli pójdę z instalacją, zostanie również zainstalowany plik wojny. Ten nie jest akceptowany w moim obecnym projekcie. Tylko plik JAR może zainstalować – David

+0

Masz rację Matt. Pójdę z instalacją. – David

3

mam rozwiązanie: za pomocą zależności z zakresem = System

w C pom.xml

  <dependency> 
      <groupId>AAA</groupId> 
      <artifactId>B</artifactId> 
      <version>0.0.1-SNAPSHOT</version> 
      <scope>system</scope> 
      <systemPath>${basedir}\..\B\target\jars\b.jar</systemPath> 
     </dependency> 

A w pom.xml umieścić modułu B na górze, jak to

<modules> 
     <module>B</module>  
     <module>C</module> 
</modules> 
+2

David, nie mam pojęcia, co robisz i dlaczego "wojna nie jest akceptowana w twoim obecnym projekcie", ale bez urazy, to zdecydowanie nie jest właściwa droga. –

5

Moje pytanie brzmi, w jaki sposób mogę rozwiązać ten problem?

rozdzielczości Zależność odbywa się za pośrednictwem lokalnego repozytorium tak kanoniczny sposób, aby „rozwiązać” problem polega na uruchomieniu install od A tak, że moduły będą instalowane w lokalnym repozytorium.

Teraz, biorąc pod następującym komentarzem

Ale jeśli pójdę z zainstalowania następnie c plik WAR zostanie również zainstalowany. Ten nie jest akceptowany w moim bieżącym projekcie. "

Jasne, nie jestem związany z twoim projektem, nie znam wszystkich ograniczeń i zasad, ale jeśli zdecydujesz się użyć Mavena, jest to całkowicie niedorzeczne polityka (poważnie, WTF?) i korzystanie z zależności zależnej od zakresu system z pewnością nie jest dobrym rozwiązaniem (więcej problemów zostanie zagwarantowanych później) .Jeśli ta zasada jest prawdziwa, lepiej nie używać Mavena w tym przypadku:

+0

Och, masz rację. Jeśli instalacja powoduje tylko skopiowanie artefaktu do lokalnego repozytorium, jest to dla mnie w porządku. Chociaż instaluję, skopiuję artefakt do zdalnego repozytorium (jestem zdezorientowany między instalacją a wdrożeniem). Dzięki. – David

1

Wykonanie instalacji mvn umieszcza tylko artefakt do lokalnego repozytorium .m2 komputera, na którym uruchamiasz polecenie.) Jak to nie może być akceptowalne? Zgadzam się z Pascalem.Jeśli budujesz A, nie powinno być żadnego powodu, dla którego wojna jest tam umieszczana.

Z drugiej strony, jeśli używasz Maven 2.2.x, spójrz na maven reactor plugin? Powinno to pomóc szalonym niedopuszczalnym nie zainstalować C.war do lokalnej polityki repozytorium .m2 dla bieżącego projektu.

+0

Och, masz rację. Jeśli instalacja powoduje tylko skopiowanie artefaktu do lokalnego repozytorium, jest to dla mnie w porządku. Chociaż instaluję, skopiuję artefakt do zdalnego repozytorium (jestem zdezorientowany między instalacją a wdrożeniem). Dzięki. – David