一、Ma ven编译错误信息
先别着急,先看清楚这个 Ma ven 编译报错的具体表现。在执行编译时,Ma ven 输出了一大串错误信息,典型截图如下:

[ERROR] Failed to execute goal org.apache.ma ven.plugins:ma ven-compiler-plugin:3.14.0:compile (default-compile) on project erp-concrete: Compilation failure: Compilation failure: [ERROR] /D:/IdeaProject/tr-erp/erp-modules/erp-concrete/src/main/ja va/com/tongruan/cm/base/service/impl/CmBaseChatecUtilsImpl.ja va:[104,63] 无法访问BaseMapperPlus [ERROR] 找不到BaseMapperPlus的类文件 [ERROR] /D:/IdeaProject/tr-erp/erp-modules/erp-concrete/src/main/ja va/com/tongruan/cm/base/service/impl/CmBaseMatSpecServiceImpl.ja va:[216,53] 找不到符号 [ERROR] 符号: 方法 selectObjs(com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper,(x)->{ ret[...]x); ) [ERROR] 位置: 类型为com.tongruan.system.mapper.SysTenantMapper的变量 sysTenantMapper [ERROR] /D:/IdeaProject/tr-erp/erp-modules/erp-concrete/src/main/ja va/com/tongruan/cm/dispatch/service/impl/CmDispatchTaskReportServiceImpl.ja va:[2066,43] 找不到符号 [ERROR] 符号: 方法 selectById(ja va.lang.Long) [ERROR] 位置: 类型为com.tongruan.system.mapper.SysDeptMapper的变量 sysDeptMapper
二、错误原因分析
2.1 错误类型
从本质上看,这类问题属于编译阶段依赖缺失,也可以理解为 Ma ven 多模块项目在编译时没有正确解析依赖。对应每个报错点,原因如下:
| 错误文件 | 错误原因 |
|---|---|
| CmBaseChatecUtilsImpl.ja va | SysDictDataMapper 继承的 BaseMapperPlus 接口无法找到 |
| CmBaseMatSpecServiceImpl.ja va | SysTenantMapper.selectObjs 方法不存在或当前编译阶段不可见 |
| CmDispatchTaskReportServiceImpl.ja va | SysDeptMapper.selectById 方法不存在或未正确加载 |
2.2 根本原因
结合项目结构来看,问题会更容易理解:
tr-erp (父POM) ├── erp-common (公共模块) │ └── erp-common-mybatis (包含 BaseMapperPlus) ├── erp-modules │ ├── erp-system (业务模块,依赖 erp-common-mybatis) │ └── erp-concrete (业务模块,依赖 erp-system)
问题关键就在这里:当你执行 mvn compile 编译指定模块时,如果没有加上 -am (also-make) 参数,Ma ven 通常只会编译当前目标模块,而不会主动把它依赖的上游模块一并编译。这样就会引发以下连锁问题:
- erp-system 模块没有先完成编译
- erp-common-mybatis 中的 BaseMapperPlus 无法正常进入编译类路径
- 当编译 erp-concrete 时,相关类、接口和方法就会出现找不到的情况
三、解决步骤
3.1 解决方案
解决这类 Ma ven 多模块编译错误的核心,就是正确使用 -am 参数。它会自动查找并编译当前模块依赖的所有模块。可直接使用以下命令:
mvn compile -pl erp-modules/erp-concrete -am -DskipTests
参数说明如下:
-pl erp-modules/erp-concrete:指定只编译 erp-concrete 模块-am(also-make):同时编译当前模块所依赖的上游模块-DskipTests:跳过测试用例,加快编译速度
3.2 验证结果
执行上述命令后,如果依赖关系正常,编译结果通常会显示成功,输出信息如下:
[INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary for tr-erp 5.5.3: [INFO] [INFO] tr-erp ............................................. SUCCESS [INFO] erp-common ......................................... SUCCESS [INFO] erp-common-core .................................... SUCCESS [INFO] erp-common-mybatis ................................. SUCCESS [INFO] erp-system ......................................... SUCCESS [INFO] erp-concrete ....................................... SUCCESS [INFO] ------------------------------------------------------------------------
四、总结
4.1 问题本质
遇到这类报错时,不要第一时间怀疑代码本身有 bug。大多数情况下,这并不是业务代码写错了,而是Ma ven 多模块依赖关系下的编译顺序没有处理好。模块 A 依赖模块 B,那么模块 B 必须先完成编译或已存在于本地仓库中。
4.2 单独编译某个模块
核心原则:要么先把依赖模块编译完成,要么提前将依赖模块安装到本地仓库。
编译 erp-concrete 模块(包含依赖)
方案一:使用 -am 参数,一次性编译目标模块及其依赖
mvn clean compile -pl erp-modules/erp-concrete -am -DskipTests
参数细节:
-pl:告诉Ma ven当前要编译哪个模块 (project list)-am:把相关依赖模块一起编译 (also-make)-DskipTests:跳过测试阶段,提升执行效率
方案二:先安装依赖,再编译目标模块(更适合日常开发)
# 第一步:先把 erp-system 和它的依赖装到本地仓库 mvn install -pl erp-modules/erp-system -am -DskipTests # 第二步:现在依赖已经在本地仓库里了,直接编译 erp-concrete mvn compile -pl erp-modules/erp-concrete -DskipTests
编译 erp-system 模块(包含依赖)
mvn clean compile -pl erp-modules/erp-system -am -DskipTests
4.3 常用打包命令速查
| 场景 | 推荐命令 |
|---|---|
| 首次完整编译 | mvn compile -DskipTests |
| 清理并完整编译 | mvn clean compile -DskipTests |
| 清理并打包 | mvn clean package -DskipTests |
| 单独编译 erp-concrete | mvn install -pl erp-modules/erp-system -am -DskipTests && mvn compile -pl erp-modules/erp-concrete -DskipTests |
| 安装到本地仓库 | mvn clean install -DskipTests |
4.4 最佳实践
开发时编译:如果你正在开发 erp-concrete 模块,建议养成习惯,在编译时始终带上 -am:
mvn compile -pl erp-modules/erp-concrete -am
清理后编译:一旦执行了 mvn clean,就建议重新使用带 -am 的命令进行完整依赖编译:
mvn clean compile -pl erp-modules/erp-concrete -am
安装依赖模块:提前把依赖模块安装到本地 Ma ven 仓库,也是比较稳妥的做法:
mvn install -pl erp-modules/erp-system -am -DskipTests
4.5 验证结果清单
| 验证项 | 状态 |
|---|---|
| Ma ven编译 erp-concrete 模块 | ✅ 成功 |
| 依赖模块编译顺序正确 | ✅ 成功 |
| 代码无需修改 | ✅ 确认 |
五、后续建议
如果后续再次遇到类似的 Ma ven 编译失败、模块依赖缺失或类找不到问题,可以按照下面的顺序逐步排查:
- 优先尝试加上
-am参数,让依赖模块一起参与编译 - 直接执行
mvn clean install -DskipTests,进行一次完整重建 - 检查 IDE 中 Ma ven 工具的模块依赖配置是否正确,是否存在未刷新或依赖识别异常
几个关键点
- 依赖顺序:Ma ven 会根据 pom.xml 中声明的依赖关系自动计算编译顺序,因此只要依赖配置本身没有问题,顺序原则上是可以自动处理的。
- -am 参数:当你需要单独编译某个模块时,使用它可以自动带出上游依赖模块,非常适合多 Module 项目。如果依赖模块已经提前安装到本地仓库,那么也可以不再使用
-am,直接编译目标模块。 - -DskipTests:在追求编译速度或持续集成场景下,这个参数非常实用,能够明显缩短构建时间。
- 推荐工作流:
- 项目首次编译:
mvn compile -DskipTests - 后续开发迭代:先用
mvn install -pl erp-modules/erp-system -am -DskipTests把依赖装好,再用mvn compile -pl erp-modules/erp-concrete -DskipTests直接编译目标模块。
- 项目首次编译:
以上就是多层 Module 依赖项目中 Ma ven 编译错误的完整解决方案。归根结底,这类问题多数都是模块编译顺序和依赖处理机制导致的,只要抓住这一点,排查和解决都会轻松很多。
