È possibile sovrascrivere la configurazione di un plugin già definito per un profilo in un POM genitore?


110

In un file genitore POM del mio progetto, ho un tale profilo che definisce alcune configurazioni utili per questo progetto (in modo da non poter sbarazzarmi di questo POM genitore):

<profile>
<id>wls7</id>
...
<build>
  <plugins>
    <!-- use java 1.4 -->
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <configuration>
        <fork>true</fork>
        <source>1.4</source>
        <target>1.4</target>
        <meminitial>128m</meminitial>
        <maxmem>1024m</maxmem>
        <executable>%${jdk14.executable}</executable>
      </configuration>
    </plugin>
  </plugins>
</build>

...
</profile>

Ma nel mio progetto vorrei solo sovrascrivere la configurazione di maven-compiler-plugin per utilizzare jdk5 invece di jdk4 per la compilazione di classi di test.

Ecco perché ho fatto questa sezione nel POM del mio progetto:

<profiles>
  <profile>
    <id>wls7</id>
        <activation>
            <property>
                <name>jdk</name>
                <value>4</value>
            </property>
        </activation>
    <build>
      <directory>target-1.4</directory>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <executions>
            <execution>
              <id>my-testCompile</id>
              <phase>test-compile</phase>
              <goals>
                <goal>testCompile</goal>
              </goals>
              <configuration>
                <fork>true</fork>
                <executable>${jdk15.executable}</executable>
                <compilerVersion>1.5</compilerVersion>
                <source>1.5</source>
                <target>1.5</target>
                <verbose>true</verbose>
              </configuration>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
  </profile>
              ...
</profiles>

e non funziona ...

Ho anche provato a sovrascrivere la configurazione nelle normali sezioni dei plugin del mio POM (voglio dire, non per un profilo specifico ma per tutto il mio POM).

Quale potrebbe essere il problema ?

Per chiarire alcune delle mie esigenze:

  • Non voglio sbarazzarmi del POM genitore e del profilo (wls7) definito al suo interno (poiché ho bisogno di molte e molte proprietà, configurazioni, ...) e questo non è il processo nella mia azienda.
  • Una soluzione basata sulla duplicazione del POM genitore e / o del profilo definito al suo interno non è buona. Dato che se il responsabile del
    genitore POM cambia qualcosa, dovrei
    segnalarlo nel mio.

È solo una questione di ereditarietà (estendere o sovrascrivere un profilo, una configurazione da un POM di livello superiore) quindi penso che dovrebbe essere possibile con Maven 2.


Come viene attivato il profilo wls7?
Pascal Thivent,

I profili wls7 e wls10 sono entrambi "activeByDefault" nel POM padre. Ma in base alle esigenze del cliente, solo il wls10 o entrambi sono costruiti da script (con il parametro "-P")
Guillaume Cernier

Risposte:


145

L'override delle configurazioni da un pom genitore può essere fatto aggiungendo l' combine.self="override"attributo all'elemento nel tuo pom.

Prova a modificare la configurazione del tuo plugin in:

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <executions>
        <execution>
          <id>my-testCompile</id>
          <phase>test-compile</phase>
          <goals>
            <goal>testCompile</goal>
          </goals>
          <configuration combine.self="override">
            <fork>true</fork>
            <executable>${jdk15.executable}</executable>
            <compilerVersion>1.5</compilerVersion>
            <source>1.5</source>
            <target>1.5</target>
            <verbose>true</verbose>
          </configuration>
        </execution>
      </executions>
    </plugin>

Per ulteriori informazioni sull'override dei plugin, vedere: http://maven.apache.org/pom.html


Sembra che per Maven2.2.1 se lo fai in un profilo non si fonde con i plugin definiti nei profili principali ma li sovrascrive. Se definisci lo stesso plugin direttamente nella sezione build, funziona. Per Maven3 si è risolto come previsto.
Greg Domjan

Non ha funzionato per me. Volevo ricostruire Jenkins NodeJS Plugin v1.0 con la versione 1.580.1 di org.jenkins-ci.plugins nel pom.xml usando Maven 3.3.9. Fino a quando non ho modificato manualmente <source> in 1.7 in ~ / .m2 / repository / org / jenkins-ci / jenkins / 1.34 / jenkins-1.34.pom non ha funzionato nulla.
Alexander Samoylov,

6

ho avuto lo stesso problema. Per impostazione predefinita, il mio plugin di maven war escludeva un file html. Ma nel mio profilo dei test di accettazione volevo includere questo file. Quindi, quando ho aggiunto di nuovo il plug-in di guerra maven, non ha sovrascritto l'impostazione predefinita.

Per risolvere questo problema, ho passato l'attributo combination.self e ho funzionato bene.

Build predefinita:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <packagingExcludes>swagger-ui/client.html</packagingExcludes>
    </configuration>
</plugin>

Profilo del test di accettazione:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration combine.self="override"/>
</plugin>

1

Hai provato a disattivare il profilo wls7 (a partire da maven 2.0.10):

A partire da Maven 2.0.10, uno o più profili possono essere disattivati ​​utilizzando la riga di comando anteponendo al loro identificatore il carattere "!" o "-" come mostrato di seguito:

mvn groupId:artifactId:goal -P !profile-1,!profile-2

Questo può essere usato per disattivare i profili contrassegnati come activeByDefault o profili che sarebbero altrimenti attivati ​​tramite la loro configurazione di attivazione.

E poi aggiungi la tua configurazione in un profilo con un nome diverso o direttamente nel tuo file pom.xml.


Come ho detto sopra, non riesco a sbarazzarmi del POM padre poiché eredito molte configurazioni definite per tutta la mia azienda a diversi livelli nel framework. E la duplicazione dei profili non dovrebbe essere una buona idea, perché avrei bisogno di segnalare le modifiche nel POM principale e molto spesso non ne sono a conoscenza. Vorrei solo sovrascrivere il comportamento solo per la compilazione di classi di test nel mio progetto.
Guillaume Cernier

Rileggi la mia risposta, non è quello che ho suggerito. Ho suggerito di disattivare un profilo, per non eliminare il POM genitore. Allora, perché dovresti segnalare le modifiche nel pom genitore? Niente ti obbliga a farlo.
Pascal Thivent

Sì Pascal, grazie per il tuo aiuto, ma il problema è che se disattivo il profilo wls7 mi sbarazzo di molte configurazioni (per altri plugin, roba generale maven, ...) mi servono ancora. E per segnalare le modifiche, intendevo DA il POM genitore al mio POM. Perché, con la soluzione che hai suggerito, avrei bisogno di duplicare tutto il POM genitore (tranne la sezione per la compilazione delle classi di test) e se il responsabile POM genitore cambia qualcosa nel suo POM, devo essere avvisato di qualsiasi modifica che è non è il processo attuale e non è molto pratico.
Guillaume Cernier

Ohh, ok, ora ho capito. Tuttavia, non sono sicuro (ma potrei sbagliarmi) che tu possa sovrascrivere parzialmente un pom, quindi non ho alcuna soluzione migliore con i dettagli forniti.
Pascal Thivent

Comunque, molte grazie Pascal per aver cercato di aiutarmi. In effetti, ho bisogno di un tale comportamento per un motivo particolare. Forse c'è un altro modo per eseguirlo:
Guillaume Cernier
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.