多层Module依赖项目Maven编译错误的解决方案

 更新时间:2026年06月11日 09:35:05   作者:xufengzhu  
本报告处理了tr-erp项目中 erp-concrete模块编译失败的问题,错误原因在于Maven模块依赖编译顺序问题:当单独编译erp-concrete时,其依赖的erp-system模块未被同步编译,导致BaseMapperPlus等类无法找到,需要的朋友可以参考下

一、Maven编译错误信息

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

二、错误原因分析

2.1 错误类型

这些错误是编译时依赖找不到的问题,具体原因如下:

错误文件错误原因
CmBaseChatecUtilsImpl.javaSysDictDataMapper 继承的 BaseMapperPlus 接口找不到
CmBaseMatSpecServiceImpl.javaSysTenantMapper.selectObjs 方法不存在
CmDispatchTaskReportServiceImpl.javaSysDeptMapper.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) 参数,Maven只会编译指定模块,不会自动编译其依赖模块。这导致:

  1. erp-system 模块未先被编译
  2. erp-common-mybatis 中的 BaseMapperPlus 类未被加载到类路径
  3. 因此 erp-concrete 编译时找不到相关类和方法

三、解决步骤

3.1 解决方案

使用 Maven 的 -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 问题本质

这不是代码错误,而是Maven模块依赖编译顺序问题。当一个模块依赖另一个模块时,需要确保依赖模块先被编译。

4.2 单独编译某个模块

核心问题:当一个模块依赖另一个模块时,需要确保依赖模块先被编译或安装到本地仓库。

编译 erp-concrete 模块(包含依赖)

方案一:使用 -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

编译 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-concretemvn 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

安装依赖模块:可以先安装依赖模块:

mvn install -pl erp-modules/erp-system -am -DskipTests

4.5 验证状态

验证项状态
Maven编译 erp-concrete 模块✅ 成功
依赖模块编译顺序正确✅ 成功
代码无需修改✅ 确认

五、后续建议

如果后续仍然遇到类似的编译问题,可以尝试:

  1. 使用 -am 参数同时编译依赖模块
  2. 执行 mvn clean install -DskipTests 重新构建整个项目
  3. 检查 IDE 的 Maven 工具是否正确配置了模块依赖

关键点

  1. 依赖顺序:Maven 会自动根据 pom.xml 中的依赖声明计算编译顺序
  2. -am 参数:当需要单独编译某个模块时,使用 -am 参数同时编译其依赖;但如果依赖模块已安装到本地仓库,建议不使用 -am,直接编译即可
  3. -DskipTests:生产环境建议添加,跳过测试以加快编译速度
  4. 推荐流程
    • 首次编译:mvn compile -DskipTests
    • 后续开发:mvn install -pl erp-modules/erp-system -am -DskipTests 然后 mvn compile -pl erp-modules/erp-concrete -DskipTests

以上就是多层Module依赖项目Maven编译错误的解决方案的详细内容,更多关于Module依赖项目Maven编译错误的资料请关注脚本之家其它相关文章!

相关文章

  • 基于Java和Redis实现排行榜功能实例代码

    基于Java和Redis实现排行榜功能实例代码

    Redis是我们Java开发中,使用频次非常高的一个nosql数据库,数据以key-value键值对的形式存储在内存中,这篇文章主要介绍了基于Java和Redis实现排行榜功能的相关资料,需要的朋友可以参考下
    2026-02-02
  • Java集合类之TreeSet的用法详解

    Java集合类之TreeSet的用法详解

    这篇文章主要为大家详细介绍了Java集合类中TreeSet的用法,文中的示例代码讲解详细,对我们学习Java有一定的帮助,感兴趣的可以了解一下
    2022-08-08
  • MyBatis连接数据库配置的基本步骤和机制

    MyBatis连接数据库配置的基本步骤和机制

    MyBatis 是一个流行的持久层框架,它通过使用XML或注解的方式将SQL语句、存储过程和Java方法进行绑定,从而避免了手写大量的JDBC代码和手动设置参数与结果集,本文给大家介绍了MyBatis连接数据库配置的基本步骤和机制,需要的朋友可以参考下
    2024-05-05
  • 数据同步利器DataX简介及如何使用

    数据同步利器DataX简介及如何使用

    DataX 是阿里云 DataWorks数据集成 的开源版本,使用Java 语言编写,在阿里巴巴集团内被广泛使用的离线数据同步工具/平台,今天给大家分享一个阿里开源的数据同步工具DataX,在Github拥有14.8k的star,非常受欢迎
    2024-02-02
  • SpringBoot JPA懒加载失效的解决方案(亲测有效)

    SpringBoot JPA懒加载失效的解决方案(亲测有效)

    这篇文章主要介绍了SpringBoot JPA懒加载失效的解决方案(亲测有效),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Maven dependencies与dependencyManagement的区别详解

    Maven dependencies与dependencyManagement的区别详解

    这篇文章主要介绍了Maven dependencies与dependencyManagement的区别详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • Java事件处理步骤讲解

    Java事件处理步骤讲解

    今天小编就为大家分享一篇关于Java事件处理步骤讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • 详解使用Spring Boot开发Web项目

    详解使用Spring Boot开发Web项目

    这篇文章主要介绍了详解使用Spring Boot开发Web项目,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-04-04
  • java中注解机制及其原理的详解

    java中注解机制及其原理的详解

    这篇文章主要介绍了java中注解机制及其原理的详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • IDEA实现java远程调试全过程

    IDEA实现java远程调试全过程

    文章主要介绍了如何在IntelliJ IDEA中配置远程调试参数,包括transport、server、suspend、address等选项的含义和作用,以及如何配置服务器防火墙以支持远程调试
    2025-11-11

最新评论