Maven编译时报错如下:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-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/java/com/tongruan/cm/base/service/impl/CmBaseChatecUtilsImpl.java:[104,63] 无法访问BaseMapperPlus
[ERROR] 找不到BaseMapperPlus的类文件
[ERROR] /D:/IdeaProject/tr-erp/erp-modules/erp-concrete/src/main/java/com/tongruan/cm/base/service/impl/CmBaseMatSpecServiceImpl.java:[216,53] 找不到符号
[ERROR] 符号: 方法 selectObjs(com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<com.tongruan.system.domain.SysTenant>,(x)->{ ret[...]x); )
[ERROR] 位置: 类型为com.tongruan.system.mapper.SysTenantMapper的变量 sysTenantMapper
[ERROR] /D:/IdeaProject/tr-erp/erp-modules/erp-concrete/src/main/java/com/tongruan/cm/dispatch/service/impl/CmDispatchTaskReportServiceImpl.java:[2066,43] 找不到符号
[ERROR] 符号: 方法 selectById(java.lang.Long)
[ERROR] 位置: 类型为com.tongruan.system.mapper.SysDeptMapper的变量 sysDeptMapper
这些错误是编译时依赖找不到的问题,具体原因如下:
| 错误文件 | 错误原因 |
|---|---|
| CmBaseChatecUtilsImpl.java | SysDictDataMapper 继承的 BaseMapperPlus 接口找不到 |
| CmBaseMatSpecServiceImpl.java | SysTenantMapper.selectObjs 方法不存在 |
| CmDispatchTaskReportServiceImpl.java | SysDeptMapper.selectById 方法不存在 |
通过分析,项目结构如下:
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) 参数,Maven只会编译指定模块,不会自动编译其依赖模块。这导致:
使用 Maven 的 -am 参数,该参数会同时编译指定模块的所有依赖模块:
mvn compile -pl erp-modules/erp-concrete -am -DskipTests
参数说明:
-pl erp-modules/erp-concrete:指定编译 erp-concrete 模块-am (also-make):同时编译指定模块的依赖模块-DskipTests:跳过测试以加快编译速度执行上述命令后,编译成功:
[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] ------------------------------------------------------------------------
这不是代码错误,而是Maven模块依赖编译顺序问题。当一个模块依赖另一个模块时,需要确保依赖模块先被编译。
核心问题:当一个模块依赖另一个模块时,需要确保依赖模块先被编译或安装到本地仓库。
方案一:使用 -am 参数(同时编译依赖模块)
mvn clean compile -pl erp-modules/erp-concrete -am -DskipTests
参数说明:
-pl: 指定要编译的模块 (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
mvn clean compile -pl erp-modules/erp-system -am -DskipTests
| 场景 | 推荐命令 |
|---|---|
| 首次完整编译 | 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 |
开发时编译:在开发 erp-concrete 模块时,始终使用 -am 参数:
mvn compile -pl erp-modules/erp-concrete -am
清理后编译:如果执行了 mvn clean,必须使用 -am 参数:
mvn clean compile -pl erp-modules/erp-concrete -am
安装依赖模块:可以先安装依赖模块:
mvn install -pl erp-modules/erp-system -am -DskipTests
| 验证项 | 状态 |
|---|---|
| Maven编译 erp-concrete 模块 | ✅ 成功 |
| 依赖模块编译顺序正确 | ✅ 成功 |
| 代码无需修改 | ✅ 确认 |
如果后续仍然遇到类似的编译问题,可以尝试:
-am 参数同时编译依赖模块mvn clean install -DskipTests 重新构建整个项目-am 参数同时编译其依赖;但如果依赖模块已安装到本地仓库,建议不使用 -am,直接编译即可mvn compile -DskipTestsmvn install -pl erp-modules/erp-system -am -DskipTests 然后 mvn compile -pl erp-modules/erp-concrete -DskipTests以上就是多层Module依赖项目Maven编译错误的解决方案的详细内容,更多关于Module依赖项目Maven编译错误的资料请关注本站其它相关文章!
您可能感兴趣的文章: