当前位置: 首页 > 科技观察

悲剧!IDEA突然找不到类?

时间:2023-03-17 13:31:19 科技观察

本文转载自微信公众号《11:30的小黑》,作者是楼下的小黑哥。转载本文请联系小黑11:30公众号。大家好,我是楼下的小黑哥~我们在本地使用IDEA运行maven项目的时候,有时候运气不好,会遇到某些maven依赖无法正常找到和导入。这样在IDEA构建工程的时候会弹出一堆醒目的红色Error。图片来自网络。最近小黑哥新拉取了一个项目的源码,在本地跑项目,又遇到了这种情况。根据之前的解决经验,摆弄了一下,发现没有办法解决。于是研究了一个下午,终于解决了这个问题??。吐槽一下,一开始以为是这个项目的问题,找了一个同事,发现他的电脑可以正常运行项目。那么今天的文章就总结一下IDEA在运行maven项目时找不到相关依赖报错的原因和解决方法。网络问题,无法下载maven依赖Maven。默认中央仓库地址为http://search.maven.org/#browse,为外网地址。但是,当我们访问国内的外网地址时,不仅网速慢,而且网络质量也很差。这就导致了maven依赖的下载速度很慢,有时可能会下载失败。maven依赖下载失败,会导致IDEA找不到相关依赖。这个问题的解决方法也比较简单,我们可以通过设置镜像的地址来解决。打开我们本地的maven配置文件,默认地址如下:${user.home}/.m2/settings.xml,然后找到mirrors节点,在下面添加如下配置:alimavenaliyunmavenhttp://maven.aliyun.com/nexus/content/groups/public/central/mirrors>lastUpdated文件导致依赖无法正常导入。更新镜像地址后,可能会遇到无法导入的maven依赖。恭喜你遇到了第二个问题。maven依赖下载时,如果网络不好导致依赖下载失败,maven会在本地生成一个后缀为lastUpdated的文件。正常的maven依赖后缀为lastUpdated的文件如下:只要lastUpdated文件存在,maven依赖就不会再次下载,所以简单的方法就是删除lastUpdated文件,重新刷新下载。这里有一个一键删除lastUpdated文件的脚本(macos)#在这里写你的仓库路径REPOSITORY_PATH=~/.m2/repositoryecho正在搜索...find$REPOSITORY_PATH-name"*lastUpdated*"|xargsrm-f??rechowindows搜索后脚本如下:#windowsscript@echooffremcreatebyNettQunrem在这里写你的仓库路径setREPOSITORY_PATH=D:\Java\maven-repository\maven-aliyun\repositoryremissearching...for/f"delims="%%iin('dir/b/s"%REPOSITORY_PATH%\*lastUpdated*"')do(echo%%idel/s/q"%%i")remsearchcompletedpausemavendependencyconflict,citationerror前两个问题主要与本地网络有关,那么这个问题主要是maven特性导致的。然后maven有一个依赖转移的特性。如果A依赖B,B依赖C,那么C的依赖会通过B间接传递给A。那么如果有多个间接依赖,但是版本不一样,就会导致依赖冲突。如上图,如果应用程序A使用E2.0添加了一些新的类或方法,那么此时由于依赖冲突,A实际上间接依赖了E1.0,导致IDEA在编译时找不到新的E。添加这些类或方法。这个问题的解决方法也比较简单。如果有冲突,我们可以直接解决冲突。我们可以在IDEA中安装一个MavenHelper插件,然后打开pom文件,点击DependencyAnalyzer选项,在这里选择Conflicts按钮,可以看到当前所有冲突的依赖包。选择其中一个依赖包,右侧可以看到所有冲突依赖包的版本。选择其中一个版本,右键单击并选择排除。在上面的方法中,我们通过排除其他间接依赖来解决问题。那么下面还有一个解决方案,将间接依赖转化为直接依赖。我们可以直接在项目的pom文件中写间接依赖,这样maven会直接使用这个依赖,其他的间接依赖就失效了。maven间接依赖异常的问题比较奇怪,也是文章开头提到的问题。项目中的依赖如下。应用A依赖B,B是一个开源项目,但是在公司内部对B做了一些修改。修改后B依赖C,所以A使用C依赖一些类。由于我本地仓库已经下载了B的开源版本,所以当我在本地拉取A应用的源码时,依赖关系就变成了图中的虚线关系。IDEA缺少C依赖,导致项目编译出错,找不到C中的一些类。这个问题的解决方法是在本地仓库中找到B依赖,然后删除pull。解决方案相对简单。关键是找到中间依赖。最后一个IDEA本地缓存异常的案例,跟IDEA有很大关系。IDEA之所以快,是因为IDEA打开一个新项目时,会建立项目索引,并生成相关的缓存。有时候,如果IDEA缓存被破坏,可能会导致IDEA无法识别maven依赖,进而导致IDEA无法找到某些类。这种情况下,我们需要删除原来的缓存和索引,等待IDEA重建缓存和索引。在IDEA中点击File/InvalidateCached。最后,如果遇到新的情况,以上方案都解决不了,那就只能用终极方案了。重启大法,重启IDEA,重启电脑