一、提出问题

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 包是否存在内部损坏问题。此时可以使用上面的文件校验工具。

images

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 键,使用全类名搜索

images

找到 jar 包后,点右键 →Show in Explorer

  • 窍门 3:如果前面的办法都没法定位,只能根据这个类看上去的特征和可能的功能找有可能有关的 jar 包

5、为什么不建议删整个库

  • 整个库删除后,需要重新下载整个库。此时东边的 jar 包没有失败,可能西边的 jar 包会失败。
  • 整个库整体重新下载时,会有很多 jar 包并行下载的,相对来说并行下载本身就容易丢失数据。