题
是否可以在父 POM 中定义一个已停用的插件,而当子项继承此插件时,它会自动激活?
解决方案
我猜你想配置你的父POM的插件,但只有在继承的项目中使用它。 Maven有此一节 - 配置pluginManagement你的插件,但将它们绑定到一个阶段只是当你需要它,例如省略pluginManagement相位标记,但下你继承POM指定它。
其他提示
所以 '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-编译器插件具有不同的目标目录(我考虑在插件错误),您必须使用Ant。
这不正是你追求的,但我认为它会工作的很好,你。
如果您在声明中父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>
您可以声明在顶层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>
子POM,使插件:
<plugin>
<groupid>org.apache.maven.plugins</groupid>
<artifactid>maven-surefire-plugin</artifactid>
<configuration>
<skip>false</skip>
</configuration>
</plugin>
我采用了以下解决方案:
在pluginManagement 部分的parent-pom 中配置插件。将插件绑定到现有阶段。
通过将parent-pom 绑定到不存在的阶段来停用该插件:覆盖插件部分中的阶段。
通过将插件包含在插件部分来激活每个子 pom 中的插件。
父 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>
子 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>
据我所知,没有对此没有通用的解决方案。至少在目前...
一个想法(我没有尝试,但它可能工作)是定义在父pom.xml中是不存在的执行目标,例如:
<executions>
<execution>
<goals>
<goal>noGoal</goal>
</goals>
</execution>
</executions>
和在每一个孩子,你重新定义一个正确的目标。
该解决方案的问题(如果它工作,当然;))是,你必须重新定义为每一个孩子的插件配置。否则,将不会被执行。