如何从父POM继承属性值?Maven继承异常问题排查
问题解答
1. 父BOM属性无法在子项目插件版本中使用的原因及解决办法
你遇到的核心问题是通过dependencyManagement导入BOM和直接继承父POM的本质区别:
- 用
<parent>标签直接继承父POM时,子项目会完整继承父POM的所有元素,包括<properties>里定义的属性。 - 但通过
<dependencyManagement>导入BOM(即<scope>import</scope>的方式),只会导入BOM中<dependencyManagement>节点下的依赖版本配置,不会继承父POM的<properties>属性。这就是${myprop.version}在子项目中失效的原因。
可行解决方案:
方案一:将BOM作为父POM直接继承
如果子项目没有其他父POM依赖,可以把bom-pom-master通过<parent>标签引入,这样就能直接复用父POM的属性:<parent> <groupId>your.group.id</groupId> <artifactId>bom-pom-master</artifactId> <version>your-bom-version</version> </parent>之后子项目中
spring-boot-maven-plugin的版本就能正常使用${myprop.version}。方案二:在父BOM的
pluginManagement中定义插件版本
在父BOM的<pluginManagement>节点下配置插件版本,子项目引用时无需重复指定版本,既能统一管理又不强制使用:<!-- 父BOM中的pluginManagement配置 --> <build> <pluginManagement> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${myprop.version}</version> </plugin> </plugins> </pluginManagement> </build>子项目只需引入插件即可:
<!-- 子项目中的plugins配置 --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>方案三:子项目重新定义属性
若不想调整继承方式,可在子项目的<properties>中重新定义myprop.version,但这种方式无法统一版本管理,不推荐。
2. spring-boot-maven-plugin不应放在父POM的<plugins>中,你的观点完全正确
你的父POM被多种类型项目继承:普通库JAR、Spring Boot可执行JAR、部署式WAR,而spring-boot-maven-plugin是专门用于打包Spring Boot可执行应用的插件,普通库项目不需要它——如果强制所有子项目加载该插件,会导致普通库打包异常(比如生成包含Spring Boot依赖的可执行JAR,不符合标准库的打包规范)。
正确做法:
将插件放在父POM的<pluginManagement>节点下(如方案二),这样:
- 所有子项目可以复用统一的插件版本。
- 只有需要该插件的项目(如Spring Boot可执行JAR、REST WAR)才需要在自己的
<plugins>中引用,普通库项目完全不受影响。
内容的提问来源于stack exchange,提问作者Bruno Genovese
相关产品推荐
相关产品推荐

