activar automaticamente plug-in pai em Maven
-
20-08-2019 - |
Pergunta
É possível ter um plugin definido no POM pai que está desativado, e quando a criança herda este plugin que é ativado automaticamente?
Solução
Eu acho que você deseja configurar o plugin no seu pom pai, mas usá-lo apenas nos projetos herdados. Maven tem uma seção para isso - configurar seus plugins em pluginManagement, mas ligá-los a uma fase apenas quando necessário, por exemplo, omitir a tag fase na pluginManagement, mas especificá-lo sob em você herdou pom.
Outras dicas
Assim 'siddhadev' é exatamente correto. Você pode definir a configuração do plugin no POM pai com um determinado id:
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>child-caller</id>
<!-- 'phase' omitted -->
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo message="called from child!" />
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
E, no POM criança, você pode listar explicitamente a fase em que este deve ser chamado:
<build>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>child-caller</id>
<phase>compile</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
Eu usei isso para alvejar vários JREs. Infelizmente, porque você não pode usar o maven-compiler-plugin com diferentes diretórios de destino (que eu considero um erro no plugin), você deve usar Ant.
Isto não é exatamente o que você está depois, mas acho que ele vai trabalhar bem o suficiente para você.
Se você declarar o plugin em uma tag pluginManagement no pai, a configuração será herdada por quaisquer projetos filho que declaram que plugin.
Por exemplo, na declarar pai que o plugin compilação usa Java 5 para a compilação de teste.
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
<execution>
<id>test-compile</id>
<goals>
<goal>testCompile</goal>
</goals>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
Então, em uma criança, você simples declarar o plugin compilador e da configuração do pai será herdada:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
</build>
Você pode declarar um plugin no pom nível superior e diga a ele para ser ignorada e, em seguida, dizer que não deve ser ignorada no nível filho. Não é bem automática, mas muito mínima na verbosidade substituição.
Pais Pom, desativando o plugin, mas declarando todo o config:
<plugin>
<groupid>org.apache.maven.plugins</groupid>
<artifactid>maven-surefire-plugin</artifactid>
<configuration>
<skip>true</skip>
...lots more config...
...lots more config...
...lots more config...
</configuration>
</plugin>
Criança Pom, permitindo que o plugin:
<plugin>
<groupid>org.apache.maven.plugins</groupid>
<artifactid>maven-surefire-plugin</artifactid>
<configuration>
<skip>false</skip>
</configuration>
</plugin>
Eu fui com a seguinte solução:
-
Configurar o plugin no pai-pom na pluginManagement-seção. Bind o plugin a uma fase existente.
-
Desactivar o plug-in para o pai-pom ligando-os a uma fase inexistente:. Substituir a fase no plug-ins de secção
-
ativar o plugin em cada criança-pom, incluindo o plugin na seção plugins.
Exemplo pai-pom:
<defaultGoal>install</defaultGoal>
<pluginManagement>
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>install-ejb-client</id>
<phase>install</phase>
<goals>
<goal>install-file</goal>
</goals>
<configuration>
<file>${ejb-client-file}</file>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
<packaging>jar</packaging>
<classifier>client</classifier>
</configuration>
</execution>
</executions>
</plugin>
...
</plugins>
</pluginManagement>
<plugins>
<plugin>
<!-- deactivate the plugin for this project, only child-projects do generate ejb-clients -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<inherited>false</inherited>
<executions>
<execution>
<id>install-ejb-client</id>
<phase>none</phase>
</execution>
</executions>
</plugin>
...
</plugins>
</build>
Exemplo criança-pom:
<build>
<plugins>
...
<plugin>
<!-- Install the generated client-jar. Property 'ejb-client-file' has to be set! Plugin configuration is in the parent pom -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
</plugin>
...
</plugins>
</build>
Tanto quanto eu sei, não há nenhuma solução genérica para este. Pelo menos por enquanto ...
Uma idéia (eu não tentar, mas pode funcionar) é definir, no pom.xml pai uma meta de execução que não existe, por exemplo:
<executions>
<execution>
<goals>
<goal>noGoal</goal>
</goals>
</execution>
</executions>
e em cada criança, você redefinir um objetivo correto.
O problema desta solução (se ele funciona, é claro;)) é que você deve redefinir a configuração do plugin para cada criança. Caso contrário, não será executada.