Maven插件配置<inherited>false仍出现在子effective-pom问题咨询
现象成因
- Maven官方对
<inherited>false</inherited>的设计定位是禁止继承插件的配置、执行规则、入参等附属属性,而非完全将插件从子模块的继承链中移除。你看到子模块有效POM中仅保留插件的groupId、artifactId、version坐标,没有其他配置内容,就是该标签实际生效的表现。 - 针对父POM中两处插件声明位置,逻辑有细微区别:
- 父POM
<build><plugins>下的插件:添加<inherited>false</inherited>后,子模块仅继承坐标,不会继承执行逻辑,实际不会在子模块构建中运行,仅在有效POM中保留占位。 - 父POM
<pluginManagement>下的插件:该节点的设计初衷就是为所有子模块提供统一的版本/基础配置管理,<inherited>false</inherited>仅阻止子模块默认继承配置,插件坐标会保留在子模块的有效pluginManagement中,方便子模块需要使用时无需重复声明版本。
- 父POM
完全隐藏插件的解决方案
如果需要彻底让该插件不出现在子模块的有效POM中,可选择以下方案:
- 方案1:用Profile隔离仅父模块需要执行的插件
在父POM中将不需要继承的插件放到专属Profile中,设置Profile仅在父模块构建时激活:
该激活规则会判断当前项目没有父POM时才激活Profile,子模块自动不会加载这些插件。<profiles> <profile> <id>parent-only-plugins</id> <activation> <property> <name>project.parent</name> <value/> </property> </activation> <build> <plugins> <!-- 把仅父模块需要执行的插件放到这里 --> </plugins> </build> </profile> </profiles> - 方案2:调整插件声明位置
如果父POM仅用作全局的依赖、插件版本管理,本身不需要执行构建逻辑,可将仅特定模块需要的插件从父POM的<build><plugins>节点移除,只在需要执行该插件的模块中单独声明。 - 方案3:子模块显式跳过(适合少量子模块场景)
如果只有个别子模块需要排除该插件,可在子模块的<build><plugins>中对该插件添加<phase>none</phase>配置,就算插件出现在有效POM中也不会执行,若需要完全抹除配置,可额外添加<configuration combine.self="override"/>清空所有继承的配置项。
补充说明:如果只是插件出现在有效POM中但没有任何执行规则和配置,本身不会对子模块的构建产生任何副作用,没有特殊要求的话无需额外处理。
内容的提问来源于stack exchange,提问作者Kirill Gagarski
相关产品推荐
相关产品推荐

