Maven父模块执行任务时子模块无法继承依赖管理版本问题
父POM的dependencyManagement版本继承异常:单独构建子模块正常,父模块执行任务报错
在父POM的dependencyManagement中统一定义了依赖版本,子模块引用这些依赖时未指定版本。单独构建子模块完全正常,但在父模块执行Maven任务(如mvn clean)时,会报错子模块依赖缺少版本号。
父POM代码
<?xml version="1.0" encoding="UTF-8"?> <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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.myproject</groupId> <artifactId>parent</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>pom</packaging> <name>parent</name> <modules> <module>common</module> </modules> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <maven.compiler.release>11</maven.compiler.release> <lombok.version>1.18.28</lombok.version> <protobuf.version>3.21.12</protobuf.version> <jackson-version>2.13.5</jackson-version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson-version}</version> </dependency> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>${protobuf.version}</version> </dependency> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java-util</artifactId> <version>${protobuf.version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </dependency> </dependencies> </dependencyManagement> <build>...</build> <distributionManagement>...</distributionManagement> <repositories>...</repositories> </project>
子模块POM代码
<?xml version="1.0" encoding="UTF-8"?> <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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.myproject</groupId> <artifactId>parent</artifactId> <version>1.0.0-SNAPSHOT</version> </parent> <artifactId>common</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>jar</packaging> <name>common</name> <description>Common module</description> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> </dependency> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java-util</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> <build>...</build> </project>
报错信息
[ERROR] The build could not read 1 project -> [Help 1] [ERROR] [ERROR] The project mx.myproject:common:1.0.0-SNAPSHOT (/#####/myproject/common/pom.xml) has 4 errors [ERROR] 'dependencies.dependency.version' for com.fasterxml.jackson.core:jackson-databind:jar is missing. @ line 26, column 17 [ERROR] 'dependencies.dependency.version' for com.google.protobuf:protobuf-java:jar is missing. @ line 30, column 17 [ERROR] 'dependencies.dependency.version' for com.google.protobuf:protobuf-java-util:jar is missing. @ line 34, column 17 [ERROR] 'dependencies.dependency.version' for org.projectlombok:lombok:jar is missing. @ line 38, column 17
环境与尝试过的操作
- 使用Maven 3.9.5(无自定义m2配置)
- 清理过m2缓存、删除项目相关工件,无效
- 将
dependencyManagement复制到子模块后问题消失,但不符合集中管理版本的需求
解决办法
1. 修正父项目groupId的一致性
报错信息中子模块的groupId显示为mx.myproject,但父POM和子模块POM中配置的是com.myproject,这是核心问题:Maven解析父POM时,子模块实际引用的父项目不存在,导致无法继承dependencyManagement中的版本定义。
修改子模块POM中的父项目groupId,确保和父POM完全一致:
<parent> <groupId>com.myproject</groupId> <!-- 修正为与父POM一致的groupId --> <artifactId>parent</artifactId> <version>1.0.0-SNAPSHOT</version> </parent>
若父项目实际groupId为mx.myproject,则修改父POM的groupId为对应值即可。
2. 添加父POM的relativePath(可选)
如果父项目还未安装到本地仓库,在子模块的<parent>节点中添加relativePath,指定父POM的相对路径,确保Maven能正确定位父POM:
<parent> <groupId>com.myproject</groupId> <artifactId>parent</artifactId> <version>1.0.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> <!-- 父POM在子模块上级目录时使用 --> </parent>
3. 确认父POM的packaging类型
父POM的packaging必须为pom,你的配置已符合要求,此点无需修改。
内容的提问来源于stack exchange,提问作者akaine
相关产品推荐
相关产品推荐

