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-plugininstall 阶段停止发射。但是,它似乎不影响其他一些插件,即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 会将 &lt;pluginManagement&gt; 部分中定义的执行与 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插件管理配置继承奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

Maven 构建/插件部分继承行为 w.r.t 到插件版本

Maven 插件配置继承

maven-聚合与继承

通过组合而不是继承导入 maven 插件配置。可以通过构建扩展来完成吗?

Maven继承

Maven 阴影插件替换 persistence.xml