2012-05-31 12 views
7

Ho questa impostazione attualmente:risorse Modifica all'interno di una sovrapposizione di guerra in Maven

Progetto A produce un file di guerra - ha un file di configurazione (WEB-INF/web.xml). Lo stiamo consegnando con una sezione di configurazione commentata che viene rimossa manualmente da un commento quando il progetto viene distribuito in un particolare ambiente.

Le esigenze del progetto sono cambiate e ho bisogno del progetto A per essere costruito interamente senza quella sezione di configurazione; e ho bisogno di un altro progetto (progetto B) da costruire CON quella sezione di configurazione (abilitata, non commentata).

Piuttosto che avere il file in entrambi i progetti (doppia manutenzione), avevo sperato che potessi far dipendere il Progetto B dal Progetto A (tramite overlay di guerra), e quindi usare il plugin maven-config-processor per aggiungere il mio configurazione speciale a WEB-INF/web.xml, quindi riconfezionare il file war.

Questo non sembra funzionare - anche se - la modifica di configurazione può funzionare se l'obiettivo esiste già (cioè dopo la corsa precedente), ma quando eseguo tutto insieme, l'overlay e il riconfezionamento nella nuova guerra avvengono insieme - e non riesco a trovare un modo per far funzionare il plugin del processore di configurazione nel mezzo. Fondamentalmente, l'ordine di default è "config-processor" (che fallisce perché l'overlay non è ancora avvenuto), quindi "war" (tutto come una unità). Non riesco a far funzionare il processore di configurazione dopo l'overlay ma prima che la guerra sia completamente pacchettizzata.

Più persone negli interni hanno chiesto negli ultimi anni se c'è un modo per iniettare un plug-in tra i passaggi "disimballare l'overlay" e "reimballare il file di guerra", ma nessuno ha apparentemente risposto a questo in modo definitivo modo. Qualche idea?

risposta

5

Dal momento che le sovrapposizioni di guerra e le confezioni da guerra sembrano essere tutte cose che fanno parte di un unico obiettivo, non credo che ci sia un modo per metterci al centro. Come soluzione alternativa, è possibile estrarre web.xml in una fase precedente ed elaborarlo. Il plugin maven-dependency può essere utilizzato nel Progetto B per estrarre web.xml dal Progetto A in una directory di lavoro, quindi eseguire maven-config-processor-plugin su web.xml e posizionare il risultato da qualche altra parte, quindi indicare a maven-war-plugin di includere che ha elaborato web.xml prima delle sovrapposizioni. In POM del Progetto B:

<plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-dependency-plugin</artifactId> 
     <version>2.4</version> 
     <executions> 
      <!-- Extract web.xml from Project A --> 
      <execution> 
       <id>unpack-webxml</id> 
       <phase>generate-resources</phase> 
       <goals> 
        <goal>unpack</goal> 
       </goals> 
       <configuration> 
        <artifactItems> 
         <artifactItem> 
          <groupId>your.group</groupId> 
          <artifactId>project.a</artifactId> 
          <version>...</version> 
          <type>war</type> 
          <overWrite>true</overWrite> 
          <outputDirectory>${project.build.directory}/myconfig/work</outputDirectory> 
          <includes>WEB-INF/web.xml</includes> 
         </artifactItem> 
        </artifactItems> 
       </configuration> 
      </execution> 
     </executions> 
    </plugin> 
    <plugin> 
     <groupId>com.google.code.maven-config-processor-plugin</groupId> 
     <artifactId>maven-config-processor-plugin</artifactId> 
     <version>2.0</version> 
     <executions> 
      <!-- Process extracted web.xml and place in temp build directory --> 
      <execution> 
       <id>process-webxml</id> 
       <goals> 
        <goal>process</goal> 
       </goals> 
       <configuration> 
        <outputDirectory>${project.build.directory}/myconfig/build</outputDirectory> 
        <transformations> 
         <transformation> 
          <input>${project.build.directory}/myconfig/work/WEB-INF/web.xml</input> 
          <output>WEB-INF/web.xml</output> 
          <!-- your transformation config --> 
         </transformation> 
        </transformations> 
       </configuration> 
      </execution> 
     </executions> 
    </plugin> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-war-plugin</artifactId> 
     <version>2.1.1</version> 
     <configuration> 
      <webResources> 
       <!-- Instruct war plugin to include temp build directory in webapp --> 
       <resource> 
        <directory>${project.build.directory}/myconfig/build</directory> 
        <includes> 
         <include>**</include> 
        </includes> 
       </resource> 
      </webResources> 
      <overlays> 
       <!-- Overlay customization if needed --> 
      </overlays> 
     </configuration> 
    </plugin> 
</plugins> 

Per quanto posso dire, il plugin di guerra include webResources primo, seguito da src/main/webapp, seguito da sovrapposizioni.

Non ho familiarità con Maven-config-processor-plugin, quindi mi scuso se la mia configurazione non è corretta.

+0

Grazie! Ha funzionato come un fascino. – M1EK

+0

Forse lo ha detto troppo presto. Non sta funzionando ora; la risorsa modificata viene sovrascritta dall'overlay anche se indica che è stata saltata. – M1EK

+0

Ma la risorsa modificata appare correttamente nella directory di compilazione temporanea ('myconfig/build' nella mia risposta)? – matts

4

È possibile utilizzare unpack goal of maven-dependency-plugin per recuperare il progetto A per ottenere local.weml in locale, quindi trasformarlo e puntare su maven-war-plugin to transformed web.xml.

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <version>2.4</version> 
      <executions> 
       <execution> 
       <id>unpack</id> 
       <phase>generate-resources</phase> 
       <goals> 
        <goal>unpack</goal> 
       </goals> 
       <configuration> 
        <artifactItems> 
        <artifactItem> 
         <groupId>org.test</groupId> 
         <artifactId>test-war1</artifactId> 
         <version>0.0.1-SNAPSHOT</version> 
         <type>war</type> 
        </artifactItem>   
        </artifactItems> 
        <outputDirectory>${project.build.directory}/wars</outputDirectory> 
       </configuration> 
       </execution> 
      </executions> 
     </plugin> 

     <plugin> 
      <groupId>com.google.code.maven-config-processor-plugin</groupId> 
      <artifactId>maven-config-processor-plugin</artifactId> 
      <version>2.0</version> 
      <configuration> 
       <!-- 
        configure to transform file 
        ${project.build.directory}/wars/WEB-INF/web.xml 
        into 
        ${project.build.directory}/transformed/web.xml 
       --> 
      </configuration> 
      <executions> 
       <execution> 
        <goals> 
         <goal>process</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.2</version> 
      <configuration> 
       <warSourceDirectory>src/main/webapp</warSourceDirectory> 
       <webXml>${project.build.directory}/transformed/web.xml</webXml> 
      </configuration> 
     </plugin> 
    </plugins> 
    </build> 
+0

Grazie! Credi che questo avrebbe funzionato; ho provato prima il primo suggerimento quindi hanno ottenuto il credito della risposta. – M1EK

+0

Ottimo!Ho provato questo approccio e funziona. Non sapevo che puoi specificare il file 'web.xml' nel' maven-war-plugin'. – Jens

Problemi correlati