问题描述
我试图弄清楚是否有可能在父pom的<pluginManagement>
部分中定义Maven插件的执行,并在子项目中选择一个特定的执行,并且仅选择一个执行。
更具体地说,我有几个多模块项目是从我们公司范围的父pom继承的。在父pom的<pluginManagement>
部分中,我使用 copy-resources 目标执行了数次maven-resources-plugin,它们均绑定到阶段 validate ,但是使用不同的配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<inherited>true</inherited>
<executions>
<execution>
<id>copy-codedeploy</id>
<phase>validate</phase>
...
</execution>
<execution>
<id>copy-settings</id>
<phase>validate</phase>
...
</execution>
<execution>
<id>copy-logback</id>
<phase>validate</phase>
...
</execution>
</executions>
<plugin>
在对子项目进行了数小时的尝试之后,我想:
- 避免在所有模块中不必要地执行 copy-logback ,这在我在父POM中定义执行 copy-logback 时会发生,并且存在创建目标的缺点所有模块中的文件夹层次结构。
- 如果在父POM中未定义执行,请避免在所有需要的模块中的多个克隆副本中定义执行。
一个子项目示例包含以下模块,其中第一个模块是唯一真正需要 copy-logback 的模块:
- webapp
- 休息
- 服务
- 持久性
我现在到达的最好的方法是将常见执行保留在父POM中,这使我在上面的第一个列表中获得了项目#1,但仍然让我在多个模块中克隆了完全相同的插件配置。我要克隆的配置是这样的:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<!-- copy logback.xml from the parent to the main resources folder,filtering the application name used in log file names. -->
<execution>
<id>copy-logback-file</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.basedir}/src/main/resources</outputDirectory>
<resources>
<resource>
<directory>${project.basedir}/../logback-templates</directory>
<filtering>true</filtering>
<includes>
<include>logback.xml</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
不幸的是,这将减少父POM中<pluginManagement>
节的用处,因为同一配置不能只定义一次。我必须在使用logback的投资组合的每个模块中定义它,这需要数十次。
为解决我的重复问题,我认为也许可以定义一个插件的执行,该插件的执行可以在需要的地方选择性地触发。有可能吗?
解决方法
您可以为每个执行的配置添加一个skip参数,例如:
<skip>${copy.logback.skip}</skip>
然后,您可以通过将属性<copy.logback.skip>
设置为true
或false
,在每个模块中选择使用还是跳过执行。