【发布时间】:2020-12-27 13:39:19
【问题描述】:
我试图弄清楚是否可以在父 pom 的 <pluginManagement> 部分中定义 Maven 插件的执行,并在子项目中选择一个特定的执行,并且只选择那个。
更具体地说,我有几个从我们公司范围的父 pom.xml 继承的多模块项目。在父 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 的唯一模块:
- 网络应用
- 休息
- 服务
- 坚持
我现在得到的最好的方法是在父 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 的 Portfolio 的每个模块中定义它,这相当于数十次。
为了解决我的重复问题,我想也许可以定义一个插件的执行,该插件可以在需要的地方有选择地触发。有可能吗?
【问题讨论】:
标签: maven maven-resources-plugin