悲剧!IDEA 突然找不到类了?

开发 前端
我们本地使用 IDEA 运行 maven 项目的时候,有时候运气不好,就会遇到某些 maven 依赖无法正常找到、导入。这就会导致 IDEA 构建项目的时候爆出一堆醒目的红色 Error。

 [[414013]]

本文转载自微信公众号「小黑十一点半」,作者楼下小黑哥 。转载本文请联系小黑十一点半公众号。

Hello,大家好,我是楼下小黑哥~

我们本地使用 IDEA 运行 maven 项目的时候,有时候运气不好,就会遇到某些 maven 依赖无法正常找到、导入。这就会导致 IDEA 构建项目的时候爆出一堆醒目的红色 Error。

图片来自网络

那最近小黑哥新拉取一个项目源码,本地运行项目,又碰到这种情况。按照以前的解决经验,捣鼓了一下,发现没办法解决。于是研究了一下午,终于解决这个问题??。

吐槽一下,刚开始一度以为是这个项目有问题,找了一个同事,发现他的电脑是却可以正常运行这个项目。

那今天这篇的文章,总结一下 IDEA 运行 maven 项目找不到相关依赖报错的问题原因以及解决办法。

网络问题,无法下载 maven 依赖

Maven 默认的中央仓库地址为 http://search.maven.org/#browse,那这是一个外网的地址。

而我们国内访问外网地址,网络速度不仅慢,网络质量还差。这就导致了maven 依赖下载速度过慢,有时候下载还可能会失败。

maven 依赖下载失败,这就会导致 IDEA 找不到相关依赖。

那这个问题解决办法也比较简单,我们可以通过设置镜像(mirrors)地址解决。

打开我们本地 maven 配置文件,默认地址如下:${user.home}/.m2/settings.xml,然后找到 mirrors节点,在这下面添加以下配置:

  1. <mirrors> 
  2.     <mirror> 
  3.       <id>alimaven</id> 
  4.       <name>aliyun maven</name
  5.       <url>http://maven.aliyun.com/nexus/content/groups/public/</url> 
  6.       <mirrorOf>central</mirrorOf>         
  7.     </mirror> 
  8. </mirrors> 

lastUpdated 文件导致依赖无法正常导入

当你更新镜像地址之后,有可能还会碰到 maven 依赖无法导入,那恭喜你碰到第二个问题了。

maven 依赖下载的时候,如果碰到网络较差,依赖下载失败,maven 本地将会生成 lastUpdated 为后缀的文件。

那正常的 maven 依赖如下

lastUpdated 为后缀的文件作用如下:

只要 lastUpdated 文件存在,maven 依赖将不会重新下载,所以做简单的方法就是,删除 lastUpdated 文件,重新刷新下载即可。

这里提供一键删除 lastUpdated 文件脚本(macos)

  1. # 这里写你的仓库路径 
  2. REPOSITORY_PATH=~/.m2/repository 
  3. echo 正在搜索... 
  4. find $REPOSITORY_PATH -name "*lastUpdated*" | xargs rm -fr 
  5. echo 搜索完 

windows 脚本如下:

  1. # windows脚本 
  2. @echo off 
  3. rem create by NettQun 
  4.    
  5. rem 这里写你的仓库路径 
  6. set REPOSITORY_PATH=D:\Java\maven-repository\maven-aliyun\repository 
  7. rem 正在搜索... 
  8. for /f "delims=" %%i in ('dir /b /s "%REPOSITORY_PATH%\*lastUpdated*"') do ( 
  9.     echo %%i 
  10.     del /s /q "%%i" 
  11. rem 搜索完毕 
  12. pause 

maven 依赖冲突,引用错误

前两个问题主要跟本地网络有比较大的关系,那这个问题,主要是因为 maven 特性导致。

那 maven 有一个依赖传递的特性,如果 A 依赖 B,而 B 依赖 C,那么 C 这个依赖就会通过 B 间接传递给 A。

那如果有多个间接依赖存在,但是彼此版本却不一样,这就会导致依赖冲突。

如上所示,如果 A 应用 使用了 E2.0 新增某些类或者方法,那这个时候由于依赖冲突,A 实际上间接依赖的是 E1.0,这就导致 IDEA 编译的时候找不到 E 新增这些类或方法。

那这个问题解决办法,也比较简单,有冲突,我们就直接解决冲突就可以了。

我们可以在 IDEA 中安装一个 Maven Helper 插件,然后打开 pom 文件,点击 Dependency Analyzer 选项,在这里面选中 Conflicts 按钮,就可以看到当前所有冲突的依赖包。

选中其中一个依赖包,就可以在右侧看到所有冲突依赖包的版本。选中其中一个版本,右键选中 Exclude 即可。

上面的办法我们通过排除其他间接依赖从而解决问题。那下面还有一种解决办法,将间接依赖转化为直接依赖。

我们可以把间接依赖直接写在项目 pom 文件里,这样 maven 将会直接使用这个依赖,其他间接依赖将会失效。

maven 间接依赖异常

这个问题,就比较诡异,这也是文章刚开头提到那个问题。

项目中依赖关系如下所示。

A 应用依赖 B ,那 B 是一个开源项目,但是公司内部对 B 进行一些修改。修改之后, B 依赖 C ,所以 A 中使用 C 依赖某些类。

那由于我本地仓库已经下载了 B 开源版本,那当我本地拉取 A 应用源码,那依赖关系就变成了 图中虚线关系。

IDEA 缺失了 C 依赖,这就导致项目编译错误,无法找到 C 中一些类。

那这个问题解决办法,就是在本地仓库找到 B 依赖,然后删除拉取即可。

解决办法比较简单,关键我们需要找到中间这个依赖。

IDEA 本地缓存异常

最后一种情况,跟 IDEA 有比较大关系。

IDEA 之所以快,那是因为 IDEA 打开新的工程的时候,它会构建项目索引以及生成相关缓存。

那有时候,如果 IDEA 缓存被破坏,那就有可能导致 IDEA 无法识别 maven 依赖, 从而导致 IDEA 无法找到某些类。

这种情况我们需要删除原先的缓存以及索引,等待 IDEA 重新构建缓存以及索引即可。

在 IDEA 中点击 File/Invalidate Cached 即可。

最后

如果你如果碰到新的情况,以上几种解决办法都没办法解决,那么只能使用终极解决办法。

重启大法,重启 IDEA,重启电脑

 

责任编辑:武晓燕 来源: 小黑十一点半
相关推荐

2021-07-14 09:36:09

Jar类文件Docker

2019-04-10 08:30:53

Python机器学习工具

2020-04-10 08:03:04

分布式锁Redlock算法流行算法

2012-09-04 10:42:48

2020-05-19 13:18:45

网页前端Web

2015-06-01 15:11:37

数据库update

2020-07-03 15:10:35

Java Rust 开发

2010-06-18 10:13:17

虚拟机消失

2023-11-27 13:19:54

模型训练

2017-12-18 12:45:41

前端高薪IT行业

2020-11-02 08:50:49

程序员机器学习年龄

2021-03-16 10:21:42

互联网工程师技术

2020-03-16 14:17:52

人工智能技术机器人

2011-05-06 16:28:44

共享打印机

2020-09-07 08:06:46

Redis容器日志

2018-03-28 09:02:50

智慧金融

2021-04-06 06:23:18

MVCC并发事务

2020-02-24 11:02:37

断网网络故障

2012-05-04 08:58:24

Win7

2018-03-24 22:05:13

简历面试招聘
点赞
收藏

51CTO技术栈公众号