欢迎光临
我们一直在努力

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

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

一、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.java SysDictDataMapper 继承的 BaseMapperPlus 接口找不到
CmBaseMatSpecServiceImpl.java SysTenantMapper.selectObjs 方法不存在
CmDispatchTaskReportServiceImpl.java 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) 参数,Maven只会编译指定模块,不会自动编译其依赖模块。这导致:

  • erp-system 模块未先被编译
  • erp-common-mybatis 中的 BaseMapperPlus 类未被加载到类路径
  • 因此 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-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

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

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

  • 4.5 验证状态

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

    五、后续建议

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

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

  • 依赖顺序:Maven 会自动根据 pom.xml 中的依赖声明计算编译顺序
  • -am 参数:当需要单独编译某个模块时,使用 -am 参数同时编译其依赖;但如果依赖模块已安装到本地仓库,建议不使用 -am,直接编译即可
  • -DskipTests:生产环境建议添加,跳过测试以加快编译速度
  • 推荐流程:
    • 首次编译:mvn compile -DskipTests
    • 后续开发:mvn install -pl erp-modules/erp-system -am -DskipTests 然后 mvn compile -pl erp-modules/erp-concrete -DskipTests
  • 赞(0)
    未经允许不得转载:171主机测评 » 多层Module依赖项目Maven编译错误的解决方案
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址