透视maven打包编译正常,intellj idea编译失败问题的本质

前言

maven多模块类型的项目,在Java的中大型应用中非常常见, 在 module 很多的情况,经常会出现各种各样的编辑依赖错误问题,今天记录一种比较常见的 case :

A 子模块依赖 B 子模块,在 Terminal 上终端上 项目根目录下打包编译是正常的,如下命令都是执行成功的:

mvn clean install -U
mvn clean package
mvn dependency:tree

但偏偏打开 IDEA 中的类文件,A 模块中的类显示找不到依赖 B 模块的类,具体就是某个子模块的依赖的类找不到,各种 reimport 和 invalid cache restart 都尝试过了,还是无法解决,这是为什么呢 ?

IDEA Maven 工程结构

如上图,maven 工程通用的配置项这里不再说明,这里着中看下和 IDE 有关两个配置项:

.idea

项目级别设置,通常包括版本控制系统信息,模块信息,运行配置,代码样式等,通常情况下,这些配置文件不应该被包含在版本控制系统中,因为它们是特定于开发环境的

.iml

模块级别设置,每个模块(Module)都有一个对应的 .iml 文件,它包含了有关模块的信息,例如源代码目录、依赖关系等, .iml 文件的一些常见内容如下:

  • 源代码目录配置: 包括 sourceFolder 元素,定义了模块中的源代码目录。
  • 依赖关系配置: 包括 orderEntry 元素,定义了模块的依赖关系,例如依赖的库、其他模块等。
  • 输出目录配置: 包括 output 元素,定义了编译输出的目录。

这些文件是由 IntelliJ IDEA 自动生成和维护的,通常无需手动编辑。它们存储了项目和模块的配置信息,以确保 IntelliJ IDEA 能够正确地理解和构建项目

注意:.idea 目录和 .iml 文件通常会被添加到 .gitignore 文件中,避免提交到代码仓库

IDE 编译报错问题

回到文章开头,maven打包是正常的情况下,IDEA 却编译报错,这通常是 pom 记载的依赖关系信息 与 iml 里面的内容不一致造成,一个典型的案例:

父pom版本升级了,子 pom 中引用的父 pom 的版本号,上次版本是 1.0.0-SNAPSHOT,这次升级成2.0.0-SNAPSHOT,修改完成后,maven打包正常,IDEA 的代码在 reimport 和 invalidate cache/restart 重启后飘红报错 。

解决依赖关系不一致问题

方法一

使用 mvn idea:module 命令,强制重新生成最新的依赖关系到 .iml 中

方法二

手动删除 .idea 目录和所有的 .iml 文件信息后,重启 IDEA,让其重新自动生成,推荐优先使用方法一,如果不生效的情况下,再使用该方法

总结

我们常常关心 maven 相关的配置,而 IDE 的一些配置文件却被忽略了,其实在本地开发环境中,尤其是使用了版本控制系统 Git 后或者项目逐渐变得庞大和复杂的时候,IDE的配置文件会记录这些东西和依赖,如果项目长时间不用再打开 或者 check一个新项目到本地后续又合并新版本分支的时候基本就容易遇见这些问题,只有了解清楚这些问题的本质,下次我们再遇见就非常容易解决了

相关推荐
BestandW1shEs3 分钟前
彻底理解消息队列的作用及如何选择
java·kafka·rabbitmq·rocketmq
爱吃烤鸡翅的酸菜鱼5 分钟前
Java算法OJ(8)随机选择算法
java·数据结构·算法·排序算法
码蜂窝编程官方9 分钟前
【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的虎鲸旅游攻略网的设计与实现
java·vue.js·spring boot·后端·spring·旅游
Viktor_Ye25 分钟前
高效集成易快报与金蝶应付单的方案
java·前端·数据库
hummhumm27 分钟前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang
一二小选手31 分钟前
【Maven】IDEA创建Maven项目 Maven配置
java·maven
J老熊37 分钟前
JavaFX:简介、使用场景、常见问题及对比其他框架分析
java·开发语言·后端·面试·系统架构·软件工程
猿java42 分钟前
什么是 Hystrix?它的工作原理是什么?
java·微服务·面试
AuroraI'ncoding43 分钟前
时间请求参数、响应
java·后端·spring
所待.3831 小时前
JavaEE之线程初阶(上)
java·java-ee