Maven多模块Spring Boot项目报错:Package does not exist
问题概述
基于Spring Initializer下载的Spring Boot 3.4.2版本项目搭建多模块Maven结构,目录如下:
root/ ├── pom.xml ├── shared/ │ └── pom.xml ├── app1/ │ └── pom.xml ├── app2/ │ └── pom.xml └── app3/ └── pom.xml
计划将shared作为共享模块提供类给其他模块复用,但执行mvn clean install -DskipTests -U或mvn clean install -pl shared,app1 -DskipTests -U时,app1编译失败,报错信息如下:
[INFO] shared ............................................. SUCCESS [ 1.787 s] [INFO] app1 ............................................... FAILURE [ 0.692 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.786 s [INFO] Finished at: 2025-01-25T17:47:29-03:00 [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0:compile (default-compile) on project app1: Compilation failure [ERROR] /C:/Users/MyUser/dev/spring boot/multi-module-app/app1/src/main/java/br/com/api/app1/App1Application.java:[3,32] package br.com.api.shared.domain does not exist
可能的原因
app1未正确依赖shared模块:检查
app1/pom.xml,确认是否添加了对shared的依赖配置,正确配置示例如下:<dependencies> <dependency> <groupId>br.com.api</groupId> <!-- 需与shared模块的groupId一致 --> <artifactId>shared</artifactId> <!-- shared模块的artifactId --> <version>${project.version}</version> <!-- 与根pom版本保持统一 --> </dependency> </dependencies>若缺少该依赖,Maven无法将shared的编译产物加入app1的classpath,导致找不到对应包。
shared模块打包类型错误:默认Maven模块打包类型为
jar,如果shared/pom.xml中设置了<packaging>pom</packaging>,该模块不会生成可被依赖的jar文件,其他模块无法引用其中的类。需确保shared的打包类型为jar(不指定时默认即为jar)。包路径不匹配或拼写错误:核对
shared模块中类的实际存放路径是否为src/main/java/br/com/api/shared/domain,同时检查app1中的导入语句是否与实际包路径完全一致(注意大小写、单词拼写)。根pom模块声明不完整:确认
root/pom.xml中是否完整声明了所有模块,示例如下:<modules> <module>shared</module> <module>app1</module> <module>app2</module> <module>app3</module> </modules>若根pom未声明shared模块,多模块构建时无法正确识别模块间的依赖关系。
Maven本地仓库缓存异常:即便使用
-U参数强制更新,仍可能存在shared模块的jar未正确安装到本地仓库的情况。可手动删除本地仓库中对应shared的目录(如~/.m2/repository/br/com/api/shared),先执行mvn clean install -pl shared安装shared,再构建app1。Spring Boot插件配置影响:如果shared模块中使用了
spring-boot-maven-plugin并启用了repackage目标,生成的会是可执行jar而非普通依赖jar,其他模块无法正常引用类。此时需调整shared的插件配置,示例如下:<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <skip>true</skip> <!-- 跳过可执行jar打包,仅生成普通依赖jar --> </configuration> </plugin>
内容的提问来源于stack exchange,提问作者Marcelo Sant'Anna

