Maven插件管理配置继承奇怪行为
Posted
技术标签:
【中文标题】Maven插件管理配置继承奇怪行为【英文标题】:Maven pluginManagement configuration inheritance strange behavior 【发布时间】:2012-09-23 06:57:49 【问题描述】:我在父级pom.xml
中使用pluginManagement
元素为其所有子级配置插件。比如我有如下配置:
<pluginManagement>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<id>copy-artifacts</id>
<phase>install</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>some/where/else</outputDirectory>
<resources>
<resource>
<directory>some/another/resource</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>install</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>deps/dir</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</pluginManagement>
官方文档指出,pluginManagement
中配置的插件仍然必须添加到子 pom 中的plugins
元素中。事实上,如果我从子 pom 中删除它:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
</plugin>
然后maven-dependency-plugin
在install
阶段停止发射。但是,它似乎不影响其他一些插件,即maven-resource-plugin
。就算我没有
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
</plugin>
在我的子 pom 中,它的 copy-resources
目标仍然在 install
阶段触发并执行它配置的工作。
为什么会出现这种行为?是否有一个总是继承的插件列表,或者我可能遗漏了什么?
【问题讨论】:
看看有效的 pom 来分析你的问题(通过 mvn help:effective-pom)。 谢谢,完全忘记了。会看看。 【参考方案1】:整个 POM 不可见;但是鉴于您所描述的行为,这是一个罐子,战争或耳朵,对吗?默认情况下,资源插件是为这些包装类型定义的。它包括一个复制资源的执行(如@maba 所述)。
由于插件定义包含在您的子 POM 中(即使您没有直接将它放在那里),Maven 会将 <pluginManagement>
部分中定义的执行与 Maven 提供的执行合并。
documentation 按包装类型描述了默认的生命周期绑定。注意dependency
插件没有被提及;但是resources
是;这就是你观察差异的原因。使用-X
运行将显示插件执行情况。
【讨论】:
是的,我的 pom 包装是罐子。所以,这是因为resources-plugin
被自动包含,它也自动从pluginManagement
继承所有配置,对吧?然后,我想,我找到了答案。我以为是这样的。非常感谢!
@VladimirMatveev 是的,默认情况下还包含其他插件。一个明显的例子是maven-compiler-plugin
。
@VladimirMatveev 我想你可以在这里找到核心插件:Maven Available Plugins。【参考方案2】:
默认情况下,Maven 总是复制 src/main/resources
内的资源。
来自Maven Getting Started Guide:
Maven 采用的简单规则是:任何放在
$basedir/src/main/resources
目录中的目录或文件都打包在您的 JAR 中,并且从 JAR 的基础开始具有完全相同的结构。
【讨论】:
我知道src/main/resources
,但是我的配置(也许我不应该用省略号替换它,我只是认为这是不必要的空间浪费)将多个文件复制到不同的位置,并且它尽管该插件已从子 pom.xml 中删除,但这是可行的吗?我已经更新了关于这个问题的问题。以上是关于Maven插件管理配置继承奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章