2010-04-22 14 views
11

Vorrei costruire due versioni diverse di una WAR in Maven (so che è un no-no, è solo il modo in cui viene data la situazione attuale). Nella versione di un WAR rappresentata da un assembly, voglio sostituire una dipendenza con la stessa dipendenza con un classificatore differente. Ad esempio, mi aspettavo questa assemblea al lavoro:Assembly Maven: include una dipendenza con un diverso classificatore

<assembly> 
    <id>end-user</id> 
    <formats> 
    <format>war</format> 
    </formats> 
    <dependencySets> 
    <dependencySet> 
     <excludes> 
     <exclude>group:artifact:jar:${project.version}</exclude> 
     </excludes> 
     <includes> 
     <include>group:artifact:jar:${project.version}:end-user</include> 
     </includes> 
    </dependencySet> 
    </dependencySets> 
</assembly> 

Questo non funziona, ma sto andando nella direzione giusta? Ho già letto tutte le pagine su Maven assembly page e la sezione su Maven Definitive Guide che sembra pertinente. Qualsiasi suggerimento sarebbe utile.

+0

Ho avuto un problema simile. Ho trovato questa domanda FAQ mi ha aiutato http://maven.apache.org/plugins/maven-assembly-plugin/faq.html#dashClassifier – Stewart

risposta

8

Personalmente, penso che la soluzione più pulita sarebbe quella di utilizzare due profili (uno a seconda del manufatto con il classificatore, l'altro sul "normale" artefatto). Ma puoi davvero ottenere ciò che desideri con un assemblaggio personalizzato. Non penso che tu stia andando nella giusta direzione. Ecco come farei ...

Prima di tutto, crea un progetto specifico per l'assemblaggio e dichiara sia la webapp che l'artefatto con il classificatore come dipendenze. Qualcosa di simile a questo:

<project> 
    ... 
    <dependencies> 
    <dependency> 
     <groupId>${project.groupId}</groupId> 
     <artifactId>artifact</artifactId> 
     <version>${project.version}</version> 
     <classifier>end-user<classifier> 
    </dependency> 
    <dependency> 
     <groupId>${project.groupId}</groupId> 
     <artifactId>zewebapp</artifactId> 
     <version>${project.version}</version> 
     <type>war</type> 
    </dependency> 
    </dependencies> 
    <build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.2-beta-5</version> 
     <configuration> 
      <descriptors> 
      <descriptor>src/main/assembly/end-user.xml</descriptor> 
      </descriptors> 
     </configuration> 
     <executions> 
      <execution> 
      <id>make-assembly</id> 
      <!-- this is used for inheritance merges --> 
      <phase>package</phase> 
      <!-- append to the packaging phase. --> 
      <goals> 
       <goal>single</goal> 
       <!-- goals == mojos --> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

Poi, nel descrittore di montaggio:

<assembly> 
    <id>end-user</id> 
    <formats> 
    <format>war</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
    <dependencySet> 
     <unpack>true</unpack> 
     <unpackOptions> 
     <excludes> 
      <exclude>**/artifact-*.jar</exclude> 
     </excludes> 
     </unpackOptions> 
     <includes> 
     <include>*:war</include> 
     </includes> 
    </dependencySet> 
    <dependencySet> 
     <unpack>false</unpack> 
     <outputDirectory>WEB-INF/lib</outputDirectory> 
     <includes> 
     <include>group:artifact:jar:*:end-user</include> 
     </includes> 
    </dependencySet>  
    </dependencySets> 
</assembly> 

Fondamentalmente, questo dice il plugin di montaggio per ottenere la guerra per zewebapp ed a disfare, ma di escludere l'artefatto indesiderata, mentre l'estrazione . Quindi, il plug-in di assembly ottiene l'artefatto con il classificatore e lo inserisce in WEB-INF/lib (quindi lo sostituiamo all'originale). Infine, il tutto è confezionato come una guerra.

Ho provato questo su un esempio semplificato, dovrebbe funzionare.

+0

Cool, grazie ... Speravo che ci fosse un modo per farlo con gli assembly da lo stesso progetto, ma il feedback che stavo facendo su questo nel modo sbagliato è stato utile. –

+0

@James Potrebbe essere possibile dichiarando entrambe le dipendenze nel modulo war (con il classificatore e senza), giocando con gli ambiti, ecc. Ma questo sarebbe un po 'oscuro e scelgo l'approccio al modulo separato. –

4

Le informazioni sulla "versione" non sono necessarie quando si specificano le coordinate degli artefatti per include/include *.

Questo dovrebbe funzionare:

<assembly> 
    <id>end-user</id> 
    <formats> 
    <format>war</format> 
    </formats> 
    <dependencySets> 
    <dependencySet> 
     <includes> 
     <include>group:artifact:jar:end-user</include> 
     </includes> 
    </dependencySet> 
    </dependencySets> 
</assembly> 

penso che il maven assembly documentation per il include/includono * sezione non è corretta. Dice che "la coordinatività degli artefatti può essere data in un semplice groupId: form artefatto, oppure possono essere pienamente qualificati nella forma groupId: artifactId: type: version [: classifier]." Tuttavia, dai miei test, la "versione" non è richiesta. Ho ricevuto il suggerimento da here.

Mi sono preso il tempo di scoprirlo, il pensiero potrebbe essere utile per gli altri in futuro.

Problemi correlati