Maven中父pom声明的依赖为何没有被子pom继承?
问题原因
核心原因是你没有使用Maven标准的父子项目继承机制,而是使用了import scope的pom依赖导入,二者的作用范围完全不同,具体规则如下:
- Maven实现父pom全量配置继承的唯一方式是在子pom根节点下声明
<parent>标签,该方式会同步继承父pom的普通依赖、全局属性、插件配置、依赖管理等所有公共配置。正确的继承写法示例:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <!-- 声明父pom,实现全量配置继承 --> <parent> <groupId>com.demo</groupId> <artifactId>deps</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- relativePath按需填写父pom的本地相对路径,不填默认从本地仓库/远程仓库拉取 --> <relativePath>../deps/pom.xml</relativePath> </parent> <modelVersion>4.0.0</modelVersion> <!-- groupId和version可省略,自动继承父pom配置 --> <artifactId>deps2</artifactId> <dependencies> <!-- 无需额外声明spring-core,会自动继承父pom的普通依赖配置 --> </dependencies> </project>
- 你当前使用的
<scope>import</scope>的pom类型依赖,仅能将目标pom的dependencyManagement节点内容导入到当前项目的依赖管理配置中,完全不会处理目标pom的普通<dependencies>节点、属性、插件等其他配置,这是Maven的内置设计规则,因此父pom中直接声明的spring-core不会被子项目引入。
可选替代方案
如果不想使用<parent>标签做父子继承,要复用父pom的普通依赖,可选择以下两种方式:
- 将父pom中需要共用的普通依赖全部移动到父pom的
dependencyManagement节点下,子项目需要使用对应依赖时,在自身<dependencies>中声明即可,无需填写版本号 - 在子项目的
<dependencies>节点中直接引入父pom作为普通依赖,配置如下:
<dependency> <groupId>com.demo</groupId> <artifactId>deps</artifactId> <version>0.0.1-SNAPSHOT</version> <type>pom</type> </dependency>
该方式会将父pom的所有普通依赖作为传递依赖引入到子项目中。
内容的提问来源于stack exchange,提问作者samshers
相关产品推荐
相关产品推荐

