2012-06-22 12 views
6

Sono nuovo di Maven e sto provando a convertire alcuni progetti su Maven e non sono sicuro di quale sia il modo corretto di strutturarli - ecco cosa avere:Progetto di progetto Maven - condivisione di un progetto comune

Ho un modulo comune - denominato Common e due diverse applicazioni che non hanno nulla in comune una parte dal fatto che entrambi dipendono da Common. Chiamiamoli A e B.

Le dipendenze tra A ->Common e B ->Common sono sia per la fase di esecuzione e per i test - il che significa che A 'classi di test s richiedono Common' s classi di test.

Ho provato varie combinazioni a cui potevo pensare - ma non hanno prodotto quello che volevo. La cosa strana è che il mio codice viene compilato, ma JUnits fallisce poiché le classi di test da Common non sono state trovate nel classpath.

Devo aggiungere 2 profili allo Common per creare 2 artefatti e aggiungere 2 dipendenze in A e B a entrambi gli artefatti? (È possibile?) Esiste un modo corretto di fare ciò che volevo? Devo ristrutturare il mio codice per adattarlo a Maven?

risposta

5

Questo è un errore comune di Maven. Le classi di test da un artefatto non sono disponibili quando si dipende da quell'artefatto. In realtà è ragionevole: quando si dipende da Common, si dipende dalle classi di produzione (file JAR). Le classi di test sono necessarie solo per eseguire test e non sono nemmeno incluse nel JAR finale.

Assumendo che il Common classi di test contengono alcuni metodo di utilità necessari per tutti i Common test, A e B test, ecco una struttura suggerita:

  • Common-test - contenente le classi di test di utilità comune (non prova dei casi!) In /src/main/java (!)
  • Common dipende Common-test con <scope>test</scope>
  • A e B dipenderà sia Common (con ambito predefinito) e Common-test (con test portata)

UML

+0

cool, quale strumento hai usato per disegnarlo? –

+0

Cosa hai usato per creare questo diagramma? Sembra pulito – zengr

+2

@zengr: http://yuml.me/ –

2

Si potrebbe strutturarlo come

  • progetto comune
  • Un progetto
  • progetto B

Ora aggiungere CommonProject per <dependency> per A & B, che renderà l'commonproject disponibile all'indirizzo compilare il tempo in modo che la build andasse bene,

Se la A & B è o webapp archetipo allora avete bisogno di fare in modo che le dipendenze sono disponibili in WEB-INF/lib in modo che si può ottenere le dipendenze in fase di esecuzione

Per rendere le dipendenze disponibile solo a test tempo, è possibile utilizzare test scope

2

Si deve eseguire test-jar obiettivo di maven-jar-plugin nel progetto Common.

Questo produce un nuovo artefatto con il classificatore tests, che contiene tutte le classi e le risorse dall'albero src/test.

Così, nel Comune aggiungere questo:

<plugins> 
    ... 
    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <executions> 
     <execution> 
     <id>test-jar</id> 
     <goals> 
      <goal>test-jar</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 
    ... 
</plugins> 

E in A e B aggiungere questo

<dependency> 
    <groupId>common.group.id</groupId> 
    <artifactId>Common</artifactId> 
    <version>1.0</version> 
    <classifier>tests</classifier> 
    <scope>test</scope> 
</dependency> 

Nota <classifier>tests</classifier> in questa dichiarazione di dipendenza.

+0

Grazie - ha fatto il trucco. Ma da quello che ho letto - questa potrebbe non essere l'architettura raccomandata - è corretta? La risposta fornita da Tomasz Nurkiewicz (http://stackoverflow.com/a/11161411/357360) è migliore di un POV dell'architettura Maven? – RonK

+0

@RonK. Direi che se le risorse 'Common/src/test' contengono backdoor per creare oggetti test in' Comune', usa il mio approccio. Se le classi contengono cinture e strutture di test comuni, usate l'approccio di Tomasz. –

Problemi correlati