Maven
Maven依赖下载失败的问题总结分析 - 图1

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

一般来说,如果没有配置,Maven会在默认的中央仓库下载各项依赖,而访问这个地址,网络速度不仅慢,网络质量还差。这就导致了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依赖下载失败的问题总结分析 - 图2
那正常的 maven 依赖如下
Maven依赖下载失败的问题总结分析 - 图3
lastUpdated 为后缀的文件作用如下:
Maven依赖下载失败的问题总结分析 - 图4
只要 lastUpdated 文件存在,maven 依赖将不会重新下载,所以做简单的方法就是,删除 lastUpdated 文件,重新刷新下载即可。
这里提供一键删除 lastUpdated 文件脚本(macos)

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

Maven 依赖冲突,引用错误

前两个问题主要跟本地网络有比较大的关系,那这个问题,主要是因为 maven 特性导致。
那 maven 有一个依赖传递的特性,如果 A 依赖 B,而 B 依赖 C,那么 C 这个依赖就会通过 B 间接传递给 A。
Maven依赖下载失败的问题总结分析 - 图5
那如果有多个间接依赖存在,但是彼此版本却不一样,这就会导致依赖冲突。
Maven依赖下载失败的问题总结分析 - 图6
如上所示,如果 A 应用 使用了 E2.0 新增某些类或者方法,那这个时候由于依赖冲突,A 实际上间接依赖的是 E1.0,这就导致 IDEA 编译的时候找不到 E 新增这些类或方法。
那这个问题解决办法,也比较简单,有冲突,就直接解决冲突就可以了。
可以在 IDEA 中安装一个 Maven Helper 插件,然后打开 pom 文件,点击 Dependency Analyzer 选项,在这里面选中 Conflicts 按钮,就可以看到当前所有冲突的依赖包。
选中其中一个依赖包,就可以在右侧看到所有冲突依赖包的版本。选中其中一个版本,右键选中 Exclude 即可。
Maven依赖下载失败的问题总结分析 - 图7
上面的办法通过排除其他间接依赖从而解决问题。那下面还有一种解决办法,将间接依赖转化为直接依赖。
可以把间接依赖直接写在项目 pom 文件里,这样 maven 将会直接使用这个依赖,其他间接依赖将会失效。

Maven 间接依赖异常

这个问题,就比较诡异,这也是刚开头提到那个问题。
项目中依赖关系如下所示。
Maven依赖下载失败的问题总结分析 - 图8
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 即可。
Maven依赖下载失败的问题总结分析 - 图9

最后

如果如果碰到新的情况,以上几种解决办法都没办法解决,那么只能尝试使用终极解决办法试试看了。
重启大法,重启 IDEA,重启电脑。