2013-07-14 15 views
9

La mia domanda era stata indirizzata in this thread, ma la spiegazione non è chiara.Maven 3 profilo con estensioni

ho questa definizione di compilazione in uno dei miei file pom.xml:

<build> 
    <finalName>${my.project}</finalName> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>2.0</version> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
      </configuration> 
     </plugin> 
    </plugins> 
    <extensions> 
     <extension> 
      <groupId>org.kuali.maven.wagons</groupId> 
      <artifactId>maven-s3-wagon</artifactId> 
      <version>1.1.19</version> 
     </extension> 
    </extensions> 
    <resources> 
     <resource> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 
      <includes> 
       <include>**/settings.properties</include> 
      </includes> 
     </resource> 
    </resources> 
</build> 

Si noti che sto usando l'estensione Maven-s3-carro. Successivamente, mi piacerebbe avere 2 profili diversi, ognuno con le proprie impostazioni, plug-in ed estensioni, ma Maven non consente il tag delle estensioni sotto un profilo.

Quando provo utilizzando un profilo:

<profiles> 
    <profile> 
     <id>local-build</id> 
     <activation> 
      <activeByDefault>true</activeByDefault> 
     </activation> 
     <build> 
      <finalName>${my.project}</finalName> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-compiler-plugin</artifactId> 
        <version>2.0</version> 
        <configuration> 
         <source>1.6</source> 
         <target>1.6</target> 
        </configuration> 
       </plugin> 
      </plugins> 
      <extensions> 
       <extension> 
        <groupId>org.kuali.maven.wagons</groupId> 
        <artifactId>maven-s3-wagon</artifactId> 
        <version>1.1.19</version> 
       </extension> 
      </extensions> 
      <resources> 
       <resource> 
        <directory>src/main/resources</directory> 
        <filtering>true</filtering> 
        <includes> 
         <include>**/settings.properties</include> 
        </includes> 
       </resource> 
      </resources> 
     </build> 
    </profile> 
</profiles> 

ottengo un errore nel mio pom:

cvc-complex-type.2.4.a: Invalid content was found starting with element 'extensions'. One of '{"http://maven.apache.org/POM/4.0.0":defaultGoal, "http://maven.apache.org/POM/ 
4.0.0":resources, "http://maven.apache.org/POM/4.0.0":testResources, "http://maven.apache.org/POM/4.0.0":directory, "http://maven.apache.org/POM/4.0.0":filters, "http:// 
maven.apache.org/POM/4.0.0":pluginManagement}' is expected. 

Domanda Quindi, utilizzando il tag estensione significa che non posso utilizzare i profili? Come posso utilizzare o modificare le estensioni di build tramite il profilo?

risposta

4

In effetti, il funzionario Maven POM reference non è chiaro circa il possibile utilizzo di extensions come parte di un profilo di Maven, in quanto afferma che si può avere un elemento build al suo interno, ma non quello della sezione build.

Tuttavia, lo standard Maven model filtra efficacemente e fornisce la sezione build che è possibile utilizzare all'interno di una sezione profile. E infatti extensionsnon è lì.

Tuttavia, quali sono le estensioni Maven? Miglioramento di Build/Lifecycle, ma anche (ed essenzialmente): una libreria aggiunta al percorso di classe runtime del build Maven, che partecipa alla build, ma non è pacchettizzata con l'artefatto finale.

Quindi, in un tale scenario (se avete bisogno di avere le estensioni di profilo o di avere un profilo per cambiare/aggiungere un'estensione) è possibile utilizzare il seguente trucco:

  • avere un'estensione innocua come estensione di default della build (mezzo dove innocui qualunque libreria che potrebbe essere parte di classpath accumulo ed essenzialmente non pregiudica affatto)
  • hanno proprietà che definiscono le coordinate GAV (G roupId, Un rtifactId, V ersion) di questo si estende ion
  • hanno un profilo che sostituisce queste proprietà con la desiderata (utile) estensione

Ad esempio, dato il seguente esempio POM:

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.sample</groupId> 
    <artifactId>project</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 

    <properties> 
     <extension.groupId>junit</extension.groupId> 
     <extension.artifactId>junit</extension.artifactId> 
     <extension.version>4.11</extension.version> 
    </properties> 

    <build> 
     <extensions> 
      <extension> 
       <groupId>${extension.groupId}</groupId> 
       <artifactId>${extension.artifactId}</artifactId> 
       <version>${extension.version}</version> 
      </extension> 
     </extensions> 
    </build> 

    <profiles> 
     <profile> 
      <id>customize-extension</id> 
      <properties> 
       <extension.groupId>junit</extension.groupId> 
       <extension.artifactId>junit</extension.artifactId> 
       <extension.version>4.12</extension.version> 
      </properties> 
     </profile> 
    </profiles> 

</project> 

La generazione predefinito (senza il profilo customize-extension attivato usa il valore predefinito properties e come tale aggiunge junit come estensione build: questo è innocuo (anche se potrebbe creare conflitti con un'altra versione junit della build, quindi assicurati di utilizzare la stessa versione di utilizzo ancora più innocua biblioteca per quello).

È possibile controllare Maven lo pick up eseguendo un davvero di prima build phase, solo per controllare le informazioni nel nostro caso, e attivare il flag di debug:

mvn initialize -X 

e controllo come parte del log di compilazione:

[DEBUG] Populating class realm extension>junit:junit:4.11 
[DEBUG] Included: junit:junit:jar:4.11 

Ora usiamo il nostro trucco: aggiungiamo (cambiamento) una proroga di accumulo tramite profilo:

mvn initialize -X -Pcustomize-extension 

E come parte del nostro log di compilazione avremmo:

[DEBUG] Populating class realm extension>junit:junit:4.12 
[DEBUG] Included: junit:junit:jar:4.12 

Bingo. Maven ha rilevato un'estensione diversa (in questo caso, una versione diversa, lo 4.12) e siamo riusciti a modificare (o aggiungere effettivamente un'estensione build significativa) tramite il profilo.

0

Solo una pazza idea: uso moduli

definire un genitore pom come questo:

<groupId>org.example</groupId> 
<artifactId>my-parent</artifactId> 
<version>1.0</version> 
<packaging>pom</packaging> 
<profiles> 
    <profile> 
     <id>use-pom1</id> 
     <modules> 
      <module>pom1</module> 
     </modules> 
    </profile> 
    <profile> 
     <id>use-pom2</id> 
     <modules> 
      <module>pom2</module> 
     </modules> 
    </profile> 
</profiles> 

Definire le estensioni desiderati sul pom1 e pom2.

+0

Infatti un interessante idea ma potrebbe complicare le cose. Poiché questo è un sistema di produzione in gioco, sto cercando di trovare una soluzione più semplice \ stable \ official \ tested. Grazie mille – forhas

+0

Beh, potresti provare a usare 'maven-assembly-plugin', usando un descrittore.xml. Ma dubito che faccia ciò che fanno le tue estensioni. –

0

Credo la soluzione è qui http://maven.apache.org/guides/mini/guide-using-extensions.html

Definire una sezione di generazione cui le estensioni sono definiti e quindi nel profilo impostare l'attributo true (come nel secondo profilo mostrato di seguito)

<build> 
    <extensions> 
     <extension> 
      <groupId>org.apache.maven.wagon</groupId> 
      <artifactId>wagon-ssh</artifactId> 
      <version>2.9</version> 
     </extension> 
    </extensions> 
</build> 

<profiles> 
    <profile> 
     <id>create-default</id> 
     <activation> 
      <activeByDefault>true</activeByDefault> 
      <property> 
       <name>build</name> 
       <value>full</value> 
      </property> 
     </activation> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-maven-plugin</artifactId> 
        <executions> 
         <execution> 
          <goals> 
           <goal>repackage</goal> 
          </goals> 
         </execution> 
        </executions> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 

    <profile> 
     <id>create-core</id> 
     <activation> 
      <property> 
       <name>build</name> 
       <value>full</value> 
      </property> 
     </activation> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-jar-plugin</artifactId> 
        <extensions>true</extensions> 
        <version>2.6</version> 
        <configuration> 
         <finalName>import-station-core-${project.version}</finalName> 
        </configuration> 
        <executions> 
         <execution> 
          <id>make-jar</id> 
          <phase>package</phase> 
          <goals> 
           <goal>jar</goal> 
          </goals> 
         </execution> 
        </executions> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
</profiles> 
Problemi correlati