2009-11-20 12 views
71

Sto scrivendo un progetto per il test di accettazione e per vari motivi questo dipende da un altro progetto che è confezionato come WAR. Sono riuscito a decomprimere il WAR usando il plugin maven-dependency-ma non riesco a far includere il mio progetto nello spacchettamento WEB-INF/lib/*.jar e WEB-INF/classes/* nel classpath in modo che la compilazione fallisca. C'è un modo per includere questi file nel classpath, o c'è un modo migliore di dipendere da una GUERRA?Dipendenza Maven WAR

Molte grazie.

risposta

11

Utilizzare overlays. Innanzitutto, il tuo progetto di test deve avere anche il packaging war.

Dichiarare dipendenza del progetto di guerra che si desidera verificare:

<dependency> 
    <groupId>${project.groupId}</groupId> 
    <artifactId>your-project-arftifactId</artifactId> 
    <version>${project.version}</version> 
    <type>war</type> 
    <scope>test</scope> 
</dependency> 

quindi configurare Maven-guerra-plugin overlay:

<plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-war-plugin</artifactId> 
     <configuration> 
      <webResources> 
       <resource> 
        <directory>${basedir}/src/main/webresources</directory> 
        <filtering>true</filtering> 
       </resource> 
      </webResources> 
      <overlays> 
       <overlay/> 
       <overlay> 
        <groupId>your.group</groupId> 
        <artifactId>your-project-artifactId</artifactId> 
       </overlay> 
      </overlays> 
     </configuration> 
    </plugin> 

Nell'esempio di cui sopra nel progetto di test ho sovrascrivere i file di configurazione webresources (come conxtext ecc.).

EDIT: Questa soluzione non è stata testata con Maven 3.

+1

Ho votato questo giù prima ho provato. Non so se questo è perché sto usando Maven3, ma in realtà entrambe le mie cartelle/class e/lib sono transitate in modo transnazionale attraverso più dipendenze di WAR. Ancora una volta - mi dispiace per averlo votato. Apparentemente, questa è la risposta "corretta". – HDave

21

Infatti, in base alla progettazione, Maven non risolve le dipendenze transitive di una guerra dichiarata come la dipendenza di un progetto. In realtà c'è un problema a riguardo, MNG-1991, ma non sarà risolto in Maven 2.xe Non sono sicuro che non so se gli overlay consentono di risolvere questo problema. La mia comprensione della soluzione suggerita è quella di duplicare le dipendenze, ad esempio in un progetto di tipo pom.


(EDIT: Dopo un po 'di più di scavo, ho trovato qualcosa di interessante in this thread che sto citando qui di seguito:

ho aiutato con lo sviluppo del progetto AppFuse nel corso dell'ultimo mese in cui facciamo uso pesante della funzione di sovrapposizione guerra nel Maven plug guerra. si tratta di una caratteristica davvero ingegnoso!

per ottenere potenza massima con sovrapposizioni di guerra ho sviluppato il plugin Warpath che consente ai progetti di utilizzare artefatti di guerra come dipendenze a pieno titolo. In breve:

1) Il contenuto della directory/WEB-INF/classes in dipendenza guerra manufatti possono essere inclusi nel classpath del progetto per la compilazione normale, ecc compiti.
2) Le dipendenze transitive dagli artefatti di dipendenza dalla guerra diventano disponibili per l'uso da altri plug-in, ad es. compile e ear - quindi non più dovendo includere tutte le dipendenze quando si creano guerre magre!

Il plug-in ora è stato utilizzato attivamente nel progetto AppFuse per gli ultimi mesi e ritengo che sia in un punto in cui è utilizzabile entrambi e stabile. Il team del plugin di guerra sarebbe interessato a includere la funzionalità del warpath all'interno del plugin war? Sembrerebbe essere il posto più naturale per ospitarlo.

Quindi, non ho alcuna esperienza con esso, ma il maven warpath plugin sembra davvero bello e semplice ed è disponibile nel repository centrale. Per usarlo, includere il seguente elemento di configurazione del plugin nel file pom.xml:

[...] 
<build> 
    <plugins> 
    <plugin> 
     <groupId>org.appfuse</groupId> 
     <artifactId>maven-warpath-plugin</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     <extensions>true</extensions> 
     <executions> 
     <execution> 
      <goals> 
      <goal>add-classes</goal> 
      </goals> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 
[...] 

e aggiungere le dipendenze di guerra che si desidera includere nel classpath come sentiero di guerra Tipo dipendenze:

[...] 
<dependencies> 
    <dependency> 
    <groupId>org.appfuse</groupId> 
    <artifactId>appfuse-web</artifactId> 
    <version>2.0</version> 
    <type>war</type> 
    </dependency> 
    <dependency> 
    <groupId>org.appfuse</groupId> 
    <artifactId>appfuse-web</artifactId> 
    <version>2.0</version> 
    <type>warpath</type> 
    </dependency> 
</dependencies> 
[...] 

Sia la guerra e sono necessari tipi di dipendenza da warpath: il war type è usato dal plugin di guerra Maven per fare l'overlay di guerra, il tipo warpath è usato dal plugin Warpath per determinare l'elenco corretto di risorse da includere nel classpath del progetto.

darei un tentativo.)

+1

Pascal, nel mio progetto ho moduli separati per l'esecuzione di test di integrazione su server diversi (ogni modulo per un server). Questi moduli di test hanno classi di test e utilizzano la dipendenza di guerra e sovrapposizioni. Io lavoro alla grande – cetnar

+0

Bene, come ho scritto, non ero sicuro, quindi grazie per il feedback, è bello sapere. Puoi solo confermare che funziona con le dipendenze transitive di una guerra e non solo con le classi di guerra java? –

+0

Sì, funziona. Tutte le librerie da WEB-INF \ lib vengono copiate. – cetnar

-1

Se si elenca la dipendenza sul progetto guerra come un barattolo di dipendenza sembra pick-up i barattoli/risorse necessarie. Sto usando Maven 2.2 + m2eclipse.

4

Buon punto, Justin. Questo mi ha effettivamente risolto il mio problema, vale a dire: includere una guerra in un assemblea e includendo tutte le sue dipendenze transitive. Non riuscivo a riprodurre la guerra dipendenza come 'jar' come lei ha suggerito dal momento che il plug-in assemblea non avrebbe trovato un vaso a cui fa riferimento che groupId/artefactId, ma

  • duplicare la guerra dipendenza come tipo pom

funziona! La guerra e le sue dipendenze transitive non sono incluse nell'assemblea. per escludere il file (ora anche apparire) pom ho dovuto aggiungere un elemento escludere in questo modo:

<excludes> 
    <exclude>*:pom</exclude> 
    </excludes> 

nel mio file assembly.xml.

Penso che questo potrebbe anche essere un modo per risolvere la domanda originale di questo thread.

101

C'è un'altra opzione dal plugin maven-war 2.1-alpha-2. Nel progetto WAR:

<plugin> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.1.1</version> 
    <configuration> 
     <attachClasses>true</attachClasses> 
    </configuration> 
</plugin> 

Questo crea un artefatto classi che è possibile utilizzare nel progetto test di accettazione con:

<dependency> 
    <groupId>your-group-id</groupId> 
    <artifactId>your-artifact-id</artifactId> 
    <version>your-version</version> 
    <classifier>classes</classifier> 
</dependency> 
+5

L'unico problema con me per me è che non entra nelle dipendenze transitive – hertzsprung

+1

Sì, grazie per questo suggerimento :) Ha funzionato per me in parte. Con la riga di comando di Maven è tutto ok. Con maven in eclipse (m2e) la compilazione di test che fanno riferimento alle classi in guerra è anche ok, ma quando provo a eseguire i test (junit), devo disattivare la risoluzione dello spazio di lavoro di m2e affinché funzioni. Altrimenti la junit eseguirà una ClassNotFoundException per le classi di riferimento della guerra. In qualche modo questi non sono inclusi nel classpath di esecuzione di junit sebbene il progetto di guerra sia elencato nella libreria delle dipendenze di maven nel percorso di costruzione del progetto. Qualche idea? – Gandalf

+1

È possibile aggiungere il parametro dipendenza come dipendenza del progetto per ottenere dipendenze transitive. Quindi si ottiene una dipendenza dalle classi e sul pom –