2010-11-10 13 views
21

Ho un progetto multi-modulo.Come far dipendere un modulo da un altro artefatto del modulo?

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

B verrà impacchettato per ottenere il file jar e quindi c utilizzerà questo file jar per compilare il codice.

In B, se corro mvn package, si creerà b.jar (soggiorni in B/target/jars non in B/target -per un altro scopo).

In C, ho bisogno di usare quello b.jar per compilare il codice.

Ora, da A, quando corro: mvn package. Per prima cosa, creo il file b.jar per B.

Ma quando si tratta della fase di compilazione di C, sembra che C non riconosca b.jar nel classpath (la compilazione riceve errori perché il codice di C non può importare la classe file da B).

La mia domanda è: come posso risolvere questo problema?

---------- Below sono i file pom

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

Proprio come una best practice (non correlata a questa domanda), i moduli B e C non devono dichiarare il proprio groupId e la propria versione; dovrebbero ereditarli dal genitore (modulo A) POM. Devono comunque dichiarare la propria confezione e artefatto. –

risposta

14

sembra che dovrebbe lavorare per me. Ma potresti provare mvn install invece di mvn package.

+0

Grazie. È una buona idea. Ma se vado con l'installazione, verrà installato anche il file c war. Quella non è accettata nel mio attuale progetto. È consentito installare solo il file jar – David

+0

Hai ragione Matt. Vado con l'installazione. – David

3

ho una soluzione: utilizzando la dipendenza con la portata = sistema

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

e in A pom.xml, messo modulo B sulla parte superiore come questo

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

David, non ho idea di cosa stai facendo e perché "la guerra non è accettata nel tuo progetto attuale" ma, non offendo, non è assolutamente la strada giusta. –

5

La mia domanda è come posso risolvere questo problema?

risoluzione delle dipendenze è fatto attraverso il repository locale in modo che il modo canonico di "risolvere" il problema è quello di eseguire install da A in modo che i moduli avranno installato nel repository locale.

Ora, per quanto riguarda il seguente commento

Ma se vado con installare poi c file di guerra verrà installato anche. Quello non è accettata nel mio progetto attuale".

Certo, io non sono il vostro progetto, non so tutti i vincoli e le regole. Ma se si decide di utilizzare Maven, questo è un assolutamente ridicolo politica (seriamente, WTF?) e utilizzando una dipendenza con scope system non è certamente una buona soluzione (più problemi successivamente garantiti) .Se questa politica è reale, meglio non usare Maven in quel caso.

+0

Oh, hai ragione. Se l'installazione copia solo l'artefatto nel repository locale, va bene per me. Io però installerò copia l'artefatto nel repository remoto (ho confuso tra installazione e distribuzione). Grazie. – David

1

Facendo installare mvn solo luoghi artefatto nel repository locale .m2 della macchina su cui stai eseguendo il comando. Come può non essere accettabile? Sono d'accordo con Pascal. Se costruisci A, non ci dovrebbe essere alcun motivo per cui la guerra viene piazzata lì.

D'altra parte, se si utilizza Maven 2.2.x, dare un'occhiata allo maven reactor plugin? Ciò dovrebbe aiutare il pazzo inaccettabile non può installare C.war nel tuo criterio di repository .m2 locale per il progetto corrente.

+0

Oh, hai ragione. Se l'installazione copia solo l'artefatto nel repository locale, va bene per me. Io però installerò copia l'artefatto nel repository remoto (ho confuso tra installazione e distribuzione). Grazie. – David

Problemi correlati