【发布时间】:2012-12-07 05:12:14
【问题描述】:
我有一个多模块 maven 项目,我想让我的所有子模块使用根 pom.xml 中指定的 maven-compiler-plugin。我应该在哪里放置maven-compiler-plugin 声明(在根pom.xml 中):在<plugins> 部分或<pluginManagement> 部分?问题也与maven-release-plugin 有关。
【问题讨论】:
我有一个多模块 maven 项目,我想让我的所有子模块使用根 pom.xml 中指定的 maven-compiler-plugin。我应该在哪里放置maven-compiler-plugin 声明(在根pom.xml 中):在<plugins> 部分或<pluginManagement> 部分?问题也与maven-release-plugin 有关。
【问题讨论】:
这两个部分(plugins 和 pluginManagement)的用途略有不同。
第一个(plugins)用于指定您的项目(以及从父项目继承的所有子项目)的构建过程。如果您在此部分中包含一些插件,它将在每个子项目中执行,无论其类型如何。
第二个(pluginManagement)用于指定所有从父项目继承的项目的通用插件设置(例如,插件版本和配置)。
谈到您提到的 2 个插件。 maven-compiler-plugin 是一个默认插件,无论你是否指定它都会被执行。将其包含在pluginManagement 中并在那里指定其配置是有意义的。但是,maven-release-plugin 默认不绑定到任何生命周期阶段。因此,如果您希望它在所有子项目中执行,则必须将其添加到 plugins 部分。
【讨论】:
maven-compiler-plugin 与 maven-release-plugin 相比默认不执行?或者我在哪里可以看到在生命周期阶段默认执行的插件列表?
maven-surfire-plugin呢?在您的解释之后,我认为它应该放在 pluginManagement 中,因为它绑定到 maven 的“测试”阶段......这是真的吗?
surefire 是运行测试的默认插件,因此将其放入 pluginManagement 是有意义的。
这取决于你追求什么。如果您将它们包含在 plugins 部分下,它们将为所有 POM 执行...包括父级。如果您只希望子 POM 执行插件目标,则应将它们放在 pluginManagement 下。但是,在这种情况下,您必须在每个子 POM 中启用它们。
也就是说,最简单的方法是先在plugins 下尝试。如果没有构建失败,那么您就可以开始了。否则,您需要将部分或全部移至pluginManagement。
【讨论】:
<plugins> 部分(在root 的pom.xml 的情况下)我们可以在子模块中标记我们需要的所有插件(无需在子模块中明确指定它们)。而在<pluginManagement> 中,我们只声明了插件configuration(例如版本),我们还需要在子模块中声明它们吗?