是否可以在父POM中定义一个已停用的插件,当子项继承此插件时,它会自动激活?
答案 0 :(得分:10)
我想您想在父pom中配置插件,但仅在继承的项目中使用它。 Maven有一个部分 - 在pluginManagement中配置你的插件,但是在你需要的时候将它们绑定到一个阶段,例如省略pluginManagement中的阶段标记,但在你继承的pom中指定它。
答案 1 :(得分:9)
所以'siddhadev'完全正确。您可以使用给定的id:
在父pom中定义插件配置<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>
并且,在子POM中,您可以明确列出应该调用它的阶段:
<build>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>child-caller</id>
<phase>compile</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
我用它来定位各种JRE。不幸的是,因为你不能将maven-compiler-plugin与不同的目标目录一起使用(我认为这是插件中的一个bug),你必须使用Ant。
答案 2 :(得分:6)
这不完全是你所追求的,但我认为它对你来说会很好。
如果您在父级的pluginManagement标记中声明插件,那么声明该插件的任何子项目都将继承该配置。
例如,在父语句中声明编译插件使用Java 5进行测试编译。
<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>
然后在一个孩子中,你简单地声明了编译器插件,并且将继承父节点的配置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
</build>
答案 3 :(得分:4)
您可以在顶级pom声明一个插件并告诉它被跳过,然后告诉它不要在子级别跳过。它不是很自动,但在重写冗长方面非常小。
父Pom,禁用该插件,但声明所有配置:
<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>
Child Pom,启用插件:
<plugin>
<groupid>org.apache.maven.plugins</groupid>
<artifactid>maven-surefire-plugin</artifactid>
<configuration>
<skip>false</skip>
</configuration>
</plugin>
答案 4 :(得分:4)
我选择了以下解决方案:
在pluginManagement-section中的parent-pom中配置插件。将插件绑定到现有阶段。
通过将父pom绑定到不存在的阶段来停用父pom的插件:覆盖插件部分中的阶段。
通过在插件部分中包含插件来激活每个子节点中的插件。
示例parent-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>
示例儿童:
<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>
答案 5 :(得分:1)
据我所知,没有通用的解决方案。至少目前......
一个想法(我没试过,但它可能有效)是在父pom.xml中定义一个不存在的执行目标,例如:
<executions>
<execution>
<goals>
<goal>noGoal</goal>
</goals>
</execution>
</executions>
在每个孩子中,你重新定义了一个正确的目标。
此解决方案的问题(当然,如果有效;))是您必须为每个孩子重新定义插件配置。否则,它将不会被执行。