2010-01-25 14 views
50

Ho una build Ant che è attualmente in fase di conversione in Maven. Tuttavia, la build Ant ha 2 build target - uno che costruisce l'intera app e uno che crea un JAR da alcuni di questi file (solo alcuni). In Ant, è facile avere più obiettivi di compilazione per gestirlo, ma sto cercando di determinare il modo migliore per gestirlo in Maven.Ant to Maven - più target di build

Potrei dividere il sottoinsieme di file in un secondo progetto e avrà il proprio POM. Quindi il primo progetto potrebbe dipendere da questo. Tuttavia, poiché il sottoinsieme di file è così piccolo (meno di 10), sembra che potrebbe essere eccessivo disporre di un progetto completamente nuovo per questo.

Esistono altri modi per gestire questo problema?

risposta

22

Il tuo primo pensiero è quello giusto. Dividere i 2 pezzi in 2 progetti.

La filosofia Maven è che ogni progetto dovrebbe basarsi solo ed unico manufatto (vaso, la guerra, a prescindere)

Si potrebbe probabilmente incidere qualcosa insieme in modo da avere un solo Maven costruzione del progetto 2 atrifacts, ma sarebbe un hack.

Puoi chiamare la formica da parte di Maven, quindi se vuoi davvero farlo, ti suggerisco di iniziare a guardare il plug-in antispam. L'ID artefatto è "maven-antrun-plugin"

5

Hai 2 scelte:

Se il sottoinsieme è soltanto un insieme di risorse, allora Non lo farei un modulo separato.

Se il progetto dipende sempre dal sottoinsieme che è impacchettato in modo uniforme, il sottoinsieme è un buon candidato per diventare un module.

Se il sottoinsieme viene riconfezionato in più "sapori" diversi, definirei gli assembly per ciascun "flavor" e qualificare i nomi di risorse con un "classificatore", vedere maven coordinates.

Infine, è possibile utilizzare i profili per determinare quali gruppi vengono prodotti, il profilo predefinito può solo creare il "sapore" di artefatto iniziale richiesto durante lo sviluppo.
Un profilo "completo" può produrre tutte le varianti di "sapore" del manufatto per la distribuzione finale una volta completato lo sviluppo.

+1

+1 grazie, la prima volta che ho sentito parlare degli assembly – stacker

+1

Ho usato gli assembly per il confezionamento degli artefatti che ho costruito insieme a dipendenze, script, ecc. È comune usare gli assembly per creare un sottoinsieme di file? O è una pratica migliore per dividere il sottoinsieme di file nel proprio progetto? –

66

Si potrebbe fare questo con i profili ...

Se davvero si voleva utilizzare due profili distinti e personalizzare il plugin JAR per includere ed escludere i modelli di nomi di classi e pacchetti, si potrebbe facilmente fare questo mettere qualcosa di simile nel tuo POM:

<profiles> 
    <profile> 
    <id>everything</id> 
    <build> 
     <plugins> 
     <plugin> 
      <artifactId>maven-jar-plugin</artifactId> 
      <configuration> 
      <classifier>everything</classifier> 
      <includes> 
       <include>**/*</include> 
      </includes> 
      </configuration> 
     </plugin> 
     </plugins> 
    </build> 
    </profile> 
    <profile> 
    <id>only-library</id> 
    <build> 
     <plugins> 
     <plugin> 
      <artifactId>maven-jar-plugin</artifactId> 
      <configuration> 
      <classifier>only-library</classifier> 
      <excludes> 
       <exclude>**/Main*</exclude> 
      </excludes> 
      </configuration> 
     </plugin> 
     </plugins> 
    </build> 
    </profile> 
</profiles> 

parte: Se questo sembra un sacco di configurazione, il supporto poliglotta di Maven per Groovy POM è quasi pronto. Ridurrà notevolmente il conto alla rovescia.

Mettete questo alla fine del vostro pom.xml (con l'elemento del progetto) e aggiunge due profili. Il primo profilo "tutto" è davvero lì solo per dimostrare la configurazione. Questo profilo "tutto" non è necessario perché duplica semplicemente il comportamento dell'output dell'obiettivo jar del plug-in JAR predefinito. Il secondo profilo "solo-libreria" esclude qualsiasi classe in qualsiasi pacchetto che inizia con il testo "Principale". Per richiamare questi profili:

mvn package -Peverything 
mvn package -Ponly-library 

Ho provato questo contro l'applicazione di esempio che viene fornito con Chapter 6 of Maven by Example, e l'esecuzione di uno di questi comandi produrrà un file JAR in $ {} basedir/bersaglio che ha un classificatore. Poiché l'obiettivo jar del plug-in JAR è associato alla fase del pacchetto nel ciclo di vita predefinito di maven, questi due profili modificheranno la configurazione per questo plug-in.

Oppure, si potrebbe fare questo con due JAR esecuzioni di plugin ...

Se è necessario creare due vasetti senza l'utilizzo di profili. È possibile associare più volte l'obiettivo jar del plug-in JAR alla fase del ciclo di vita del pacchetto e utilizzare una configurazione diversa per ogni esecuzione configurata. Se si configurano due esecuzioni separate, ogni esecuzione ha un blocco di configurazione specifico dell'esecuzione in modo da poter fornire un identificativo univoco e un modello di inclusione/esclusione per ciascuna esecuzione.

Ecco l'elemento di generazione che si utilizzerà per aggiungere entrambi i JAR personalizzati al "pacchetto" della fase del ciclo di vita. Eseguendo questa operazione su un progetto con "jar" di imballaggio, l'obiettivo jar viene eseguito tre volte. Una volta come il collegamento del ciclo di vita predefinito, e poi due volte per due JAR classificati personalizzati.

<build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-jar-plugin</artifactId> 
     <executions> 
      <execution> 
      <id>only-library</id> 
      <goals><goal>jar</goal></goals> 
      <phase>package</phase> 
      <configuration> 
       <classifier>only-library</classifier> 
       <excludes> 
       <exclude>**/Main*</exclude> 
       </excludes> 
      </configuration> 
      </execution> 
      <execution> 
      <id>everything</id> 
      <goals><goal>jar</goal></goals> 
      <phase>package</phase> 
      <configuration> 
       <classifier>everything</classifier> 
       <includes> 
       <include>**/*</include> 
       </includes> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 

Se non si sta parlando tra cui un diverso insieme di classi in ogni artefatto, ti consigliamo di utilizzare Assemblee Maven. Se vuoi conoscere i dettagli degli assembly, c'è un capitolo elencato alla fine di questa risposta di Maven: The Complete Reference. Francamente, non penso che questo particolare capitolo sia un buon riferimento introduttivo; in effetti, ho avuto numerosi rapporti sul fatto che questo capitolo è quasi illeggibile (e stiamo lavorando per risolverlo). Se stai cercando di utilizzare gli assembly, ti consigliamo lo Maven Assembly Plugin's documentation. Nel menu di navigazione a sinistra vedrai un elenco di descrittori dell'assieme di campioni.

Disclaimer: (Per favore) non farlo. Se stai creando due JAR di differenza con due diversi gruppi di classi, ti consiglio vivamente di dividere il progetto in due moduli interdipendenti.

Mentre è possibile farlo con i profili, sarà più facile dividere il progetto in due (in realtà tre). A lungo termine ci saranno sfide che dovrai affrontare mentre la tua applicazione si ridimensiona. Sarai responsabile della ricerca di questo elenco di manuali di classi e pacchetti da includere in ciascuno dei tuoi JAR classificati.

C'è un sovraccarico minimo per avere un progetto genitore semplice che faccia riferimento a due moduli separati. Se guardi il libro Maven gratuito di Example, ti mostriamo come effettuare la transizione tra un modulo singolo e un progetto multi-modulo. Chapters 3-5 concentrarsi su singoli progetti di modulo e Chapter 6 mostra come si combinano questi singoli componenti del modulo in un progetto multi-modulo più grande.

Per maggiori informazioni:

È questione coinvolge i seguenti argomenti, ecco alcuni link che forniranno maggiori dettagli per ogni:

Il Plugin JAR Maven: http://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html

Multi-module Progetti Maven: Chapter 6 of Maven by Example e Section 3.6.2 of Maven: The Complete Reference.

The Maven ciclo di vita (vaso è destinata a confezionare se il packagin è "jar"): Section 3.5.2 of Maven by Example "Core Concepts" e Chapter 4 of Maven: The Complete Reference

Assemblee Maven: In primo luogo, il Maven Assembly Plugin site, poi Chapter 8 of Maven: The Complete Reference per alcuni pesanti (quasi troppo pesanti) dettagli.

+4

Wow, bella risposta Tom. Big +1. –

+0

Grazie per la risposta dettagliata. Mi piacerebbe stare lontano dall'usare modelli di pacchetto. Sembra un mal di testa da manutenzione se altri sviluppatori arrivano e non conoscono necessariamente i pattern che devono essere utilizzati. –