Maven pluginManagement配置继承奇怪的行为

时间:2012-10-02 12:14:41

标签: maven inheritance build maven-plugin pom.xml

我在父pluginManagement中使用pom.xml元素为其所有子节点配置插件。例如,我有以下配置:

<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中配置的插件仍然必须添加到子poms中的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阶段触发并执行配置的工作。

为什么会出现这种情况?是否有一个总是继承的插件列表,或者我可能遗漏了什么?

2 个答案:

答案 0 :(得分:7)

整个POM不可见;但鉴于你所描述的行为,这是一个罐子,战争或耳朵,对吗?默认情况下,为这些打包类型定义资源插件。它包括复制资源的执行(如@maba所述)。

由于插件定义包含在您的子POM中(即使您没有将其直接放在那里),Maven会将<pluginManagement>部分中定义的执行与Maven提供的执行合并。

documentation描述包装类型的默认生命周期绑定。请注意,未提及dependency插件;但resources是;这就是你观察差异的原因。使用-X运行将显示插件执行。

答案 1 :(得分:1)

默认情况下,Maven始终复制src/main/resources内的资源。

来自Maven Getting Started Guide

  

Maven使用的简单规则是这样的:放置在${basedir}/src/main/resources目录中的任何目录或文件都打包在JAR中,其结构与JAR基础相同。