Maven_jar包下载失败问题的解决方案
一、提出问题
Maven 替我们去下载 jar 包的时候,有可能出现在网络传输过程中数据丢失、中途断网,从而导致下载失败。
二、Maven 正常下载的做法
- jar 包在下载过程中,jar 包的扩展名是 xxx.jar.lastUpdated
- jar 包下载成功后,Maven 会将 lastUpdated 扩展名删除,让 jar 包恢复为 xxx.jar 这样的名称
三、下载失败的第一种情况
1、Maven 的行为描述
- jar 包在下载过程中,jar 包的扩展名是 xxx.jar.lastUpdated
- 网络连接丢失,无法继续下载
- jar 包没有下载完,lastUpdated 扩展名不会被删除
- 当我们要求 Maven 重新下载时,Maven 看到这个 jar 包的扩展名是 lastUpdated,Maven 就不管了
2、解决办法
手动删除所有以 lastUpdated 结尾的文件,然后让 Maven 重新下载。可是当仓库中 lastUpdated 文件太多的时候,手动删除不可行,所以我们需要借助批处理文件:clearLastUpdated.bat。使用方法:
- 将 clearLastUpdated.bat 文件复制到本地仓库的根目录
- 使用文件编辑打开 clearLastUpdated.bat 文件
- 修改下面的内容
SET CLEAR_PATH=设置为本地仓库所在的盘符
SET CLEAR_DIR=设置为本地仓库的根目录的路径
例如:
SET CLEAR_PATH=D:
SET CLEAR_DIR=D:\maven-rep1026
- 在想要执行清理时,双击运行这个文件即可
3、要求 Maven 重新下载 jar 包
四、下载失败的第二种情况
1、文件校验工具
jar 包表面上看起来是下载完的状态,结尾并没有“.lastUpdated”扩展名。但是程序运行时找不到这个 jar 包中的类。例如:针对 jar 包中的类出现 ClassNotFoundException。
遇到类似问题需要先确认一下“有嫌疑”的 jar 包是否存在内部损坏问题。此时可以使用上面的文件校验工具。
2、用法
- 打开文件校验工具
- 将待校验的 jar 包拖拽到文件校验工具窗口内
- 将待校验的 jar 包旁边的*.sha1 文件打开
- 比较两个 SHA1 值
- 一致:jar 包完好
- 不一致:jar 包损坏
3、原理
HASH 加密包括很多具体加密算法,但是所有 HASH 算法都满足下面特征:
- 只要输入数据不变,任何时候执行加密,输出不变
- 输入数据有细微变化,输出数据跟着变化
- 不可逆,不能通过密文反推回明文
- 每一种具体的 HASH 加密算法加密后长度固定
4、找到有嫌疑的 jar 包
假设现在出现了一个 ClassNotFoundException,提示找不到类:org.springframework.expression.Expression。此时我们怀疑这个类所在的 jar 包下载失败。
- 窍门 1:类所在的 package 命名往往和 jar 包坐标的 groupId 部分类似。
- 窍门 2:在 IDEA 中按两下 Shift 键,使用全类名搜索
找到 jar 包后,点右键 →Show in Explorer
- 窍门 3:如果前面的办法都没法定位,只能根据这个类看上去的特征和可能的功能找有可能有关的 jar 包
5、为什么不建议删整个库
- 整个库删除后,需要重新下载整个库。此时东边的 jar 包没有失败,可能西边的 jar 包会失败。
- 整个库整体重新下载时,会有很多 jar 包并行下载的,相对来说并行下载本身就容易丢失数据。
本文采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ShiGuang
评论