É possível substituir a configuração de um plugin já definido para um perfil em um POM pai?

109

Em um arquivo POM pai do meu projeto, tenho esse perfil definindo algumas configurações úteis para este projeto (de modo que não posso me livrar deste POM pai):

<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>

Mas em meu projeto, eu gostaria apenas de substituir a configuração do maven-compiler-plugin para usar jdk5 em vez de jdk4 para compilar classes de teste.

É por isso que fiz esta seção no POM do meu projeto:

<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 não está funcionando ...

Eu até tentei sobrescrever a configuração em seções regulares do plug-in do meu POM (quero dizer, não para um perfil específico, mas para todo o meu POM).

Qual pode ser o problema?

Para esclarecer alguns dos meus requisitos:

  • Não quero me livrar do POM pai e do perfil (wls7) definido dentro dele (já que preciso de muitas e muitas propriedades, configurações, ...) e esse não é o processo na minha empresa.
  • Uma solução baseada na duplicação do POM pai e / ou do perfil definido dentro dele não é boa. Pois se o responsável do
    pai POM mudar alguma coisa, eu
    teria que denunciar no meu.

É apenas uma questão de herança (estender ou substituir um perfil, uma configuração de um POM de nível superior), então acho que deve ser possível com o Maven 2.

Guillaume Cernier
fonte
Como o perfil wls7 é ativado?
Pascal Thivent
Os perfis wls7 e wls10 são ambos "activeByDefault" no POM pai. Mas de acordo com as necessidades do cliente, apenas o wls10 ou ambos são construídos por scripts (com o parâmetro "-P")
Guillaume Cernier

Respostas:

144

Substituir as configurações de um pom pai pode ser feito adicionando o combine.self="override"atributo ao elemento em seu pom.

Tente alterar a configuração do plug-in para:

    <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>

Para obter mais informações sobre substituição de plug-ins, consulte: http://maven.apache.org/pom.html

Rolf
fonte
Parece que para Maven2.2.1, se você fizer isso em um perfil, ele não se mesclará com os plug-ins definidos nos perfis pais, mas os substituirá. Se você definir o mesmo plugin diretamente na seção de construção, ele funcionará. Para Maven3, foi resolvido conforme o esperado.
Greg Domjan
Não funcionou para mim. Eu queria reconstruir Jenkins NodeJS Plugin v1.0 com a versão 1.580.1 de org.jenkins-ci.plugins no pom.xml usando Maven 3.3.9. Até eu alterar manualmente o <source> para 1.7 em ~ / .m2 / repository / org / jenkins-ci / jenkins / 1.34 / jenkins-1.34.pom nada funcionou.
Alexander Samoylov
6

Eu tive o mesmo problema. Por padrão, meu plugin do maven war excluiu um arquivo html. Mas no meu perfil de testes de aceitação, eu queria esse arquivo incluído. Então, quando eu adicionei o plugin maven war novamente, ele não substituiu o padrão.

Para resolver esse problema, passei no atributo combine.self e funcionou bem.

Compilação padrão:

<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>

Perfil de teste de aceitação:

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

Você tentou desativar o perfil wls7 (desde maven 2.0.10):

A partir do Maven 2.0.10, um ou mais perfis podem ser desativados usando a linha de comando, prefixando seu identificador com o caractere '!' ou '-' conforme mostrado abaixo:

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

Isso pode ser usado para desativar perfis marcados como activeByDefault ou perfis que, de outra forma, seriam ativados por meio de sua configuração de ativação.

Em seguida, adicione sua configuração em um perfil com um nome diferente ou diretamente no seu pom.xml.

Pascal Thivent
fonte
Como eu disse acima, não consigo me livrar do POM pai, pois herdei muitas configurações definidas para toda a minha empresa em diferentes níveis da estrutura. E duplicar perfis não deve ser uma boa ideia, porque eu precisaria relatar alterações no POM pai e, na maioria das vezes, não tenho conhecimento delas. Eu só gostaria de substituir o comportamento apenas para a compilação de classes de teste em meu projeto.
Guillaume Cernier
Releia minha resposta, não foi o que sugeri. Sugeri desativar um perfil, não se livrar do POM pai. Então, por que você teria que relatar mudanças no pom pai? Nada te força a fazer isso.
Pascal Thivent
Sim Pascal, obrigado pela ajuda, mas o problema é que se eu desativar o perfil wls7 eu me livrei de muitas configurações (para outros plugins, coisas gerais do maven, ...) eu ainda preciso. E por relatar mudanças, eu quis dizer DO POM pai para o meu POM. Porque, com a solução que você sugeriu, eu precisaria duplicar todo o POM pai (exceto para a seção de compilação das classes de teste) e se o POM pai responsável mudar algo em seu POM, preciso ser avisado de qualquer alteração que seja não é o processo atual e não é muito prático.
Guillaume Cernier
Ohh, ok, entendi agora. No entanto, não tenho certeza (mas posso estar errado) se você pode substituir um pom parcialmente, então não tenho nenhuma solução melhor com os detalhes fornecidos.
Pascal Thivent
De qualquer forma, muito obrigado Pascal por tentar me ajudar. Na verdade, preciso de tal comportamento por um motivo específico. Talvez haja outra maneira de fazê-lo:
Guillaume Cernier