什么是Maven的pom.xml中的pluginManagement?

时间:2012-05-07 13:43:09

标签: java maven build pom.xml maven-dependency-plugin

这是我的pom文件的片段。

....
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.4</version>                        
                <executions>
                    <execution>
                        <phase>install</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            ......
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
...

我使用命令

成功使用它
mvn install

但是,当我尝试将其封装到“pluginManagement”标记中时,maven-dependency-plugin会在我启动install目标时停止工作。 为什么“pluginManagement”标签会改变构建行为?或者我应该使用其他目标或选项吗?

5 个答案:

答案 0 :(得分:263)

您仍然需要添加

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
    </plugin>
</plugins>
在您的构建中

,因为pluginManagement只是在所有项目模块中共享相同插件配置的一种方式。

来自Maven文档:

  

pluginManagement :是一个沿侧插件看到的元素。插件管理以大致相同的方式包含插件元素,除了不是为这个特定的项目构建配置插件信息,它旨在配置从这个继承的项目构建。但是,这仅配置在子节点的plugins元素中实际引用的插件。孩子们有权覆盖插件管理定义。

答案 1 :(得分:213)

<pluginManagement/><plugins/>之间的区别在于<plugin/>下:

  • <pluginManagement/>定义将由构建中的模块继承的插件的设置。这适用于有父pom文件的情况。

  • <plugins/>是插件的实际调用。它可能会也可能不会从<pluginManagement/>继承。

如果项目不是父POM,则您的项目中不需要<pluginManagement/>。但是,如果它是父母pom,那么在孩子的pom中,你需要有一个声明:

<plugins>
    <plugin>
        <groupId>com.foo</groupId>
        <artifactId>bar-plugin</artifactId>
    </plugin>
</plugins>

请注意您未定义任何配置。您可以从父级继承它,除非您需要根据子项目的需要进一步调整您的调用。

有关更多具体信息,请查看:

答案 2 :(得分:33)

您可以在父pom中使用pluginManagement来配置它,以防任何子pom想要使用它,但并非每个子插件都想使用它。一个例子可以是你的超级pom为maven Javadoc插件定义了一些选项。并非每个子pom都可能想要使用Javadoc,因此您可以在pluginManagement部分中定义这些默认值。想要使用Javadoc插件的子pom,只定义一个插件部分,并将从父pom中的pluginManagement定义继承配置。

答案 3 :(得分:3)

  

pluginManagement:是一个沿侧插件看到的元素。插件管理以大致相同的方式包含插件元素,除了不是为这个特定的项目构建配置插件信息,它旨在配置从这个继承的项目构建。但是,这仅配置在子节点的plugins元素中实际引用的插件。孩子们有权覆盖插件管理定义。

来自http://maven.apache.org/pom.html#Plugin%5FManagement

复制自:

Maven2 - problem with pluginManagement and parent-child relationship

答案 4 :(得分:0)

因此,如果我理解得很好,我会说<pluginManagement>就像<dependencyManagement>都只用于在父级子模块及其子模块之间共享配置。

为此,我们在父项目中定义了依赖项和插件的通用配置,然后我们只需要在子模块中声明依赖项/插件即可使用它,而不必为其定义配置(即版本或执行) ,目标等)。但这并不能阻止我们覆盖子模块中的配置。

相反,<dependencies><plugins>继承了它们的配置,因此不应在子模块中重新声明,否则会发生冲突。

对吗?