记一次 Maven 本地仓库埋坑之 Verifying Availability

背景

某 Java 后端项目使用 maven 构建,因为某些原因,某些依赖库下载不了,直接找其它人索要了他电脑上的 maven 本地仓库里的依赖包。

然后直接拷贝到我电脑的本地 maven 仓库里,但构建项目时,发现,仍旧报找不到依赖包也下载不了的错误,导致项目构建不起来。

异常信息

以上是背景,下面是构建过程出现的一些异常:

  • The Pom for xxx.jar is missing, no dependency information available
[WARNING] The POM for xxx:jar:5.1-RELEASE is missing, no dependency information available
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.992 s
[INFO] Finished at: 2019-11-09T13:21:15+08:00
[INFO] Final Memory: 15M/300M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project xxx-app: Could not resolve dependencies for project xxx: Failure to find xxx:jar:5.1-RELEASE in http://maven.aliyun.com/nexus/content/groups/public was cached in the local repository, resolution will not be reattempted until the update interval of nexus-aliyun has elapsed or updates are forced -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]

分析

我们知道,maven 仓库有本地仓库、镜像仓库、仓库中心之说。

除了本地仓库,其他都位于远程服务器上,如果远程仓库里确实没有我们需要的依赖包,那自然就下载不了,这点可以理解。

但为什么明明我们已经从其他地方拿到依赖包,把它放到本地仓库里了,为何构建项目时,不直接去本地仓库里拿依赖包呢?

可能你会觉得是不是 idea 的问题,相信你也尝试过设置 idea 的 maven 相关配置,比如开启 offline 模式、设置本地仓库地址、配置文件,甚至去 maven 的配置文件中修改各种配置项。

可能你会觉得是不是 idea 缓存了项目的配置问题,然后去重启 idea,去删除 .idea 文件,去重新 import 项目。

但最后,问题还是一样,还是报找不到依赖包错误。

明明你的同事也是将依赖包放到本地而已啊,明明你的依赖包就是从同事那里拷过来的,为何他项目可以成功构建,而你的不行呢?

原因其实我也不知道,而且因为异常信息过少,网络上搜索类似 maven 本地依赖包不起作用之类的关键词,也仍旧找不到解决方案。

后来,为了知道更多异常信息,参考上面异常时给出的建议,在执行构建命令时,带上了 -e -X 参数:

[DEBUG] Verifying availability of C:\Users\suxq\.m2\repository\com\xxx\5.1-RELEASE\xxx-5.1-RELEASE.pom from [nexus-aliyun (http://maven.aliyun.com/nexus/content/groups/public, default, releases+snapshots)]

[WARNING] The POM for com.chinanetcenter.light:web:jar:5.1-RELEASE is missing, no dependency information available

看来,构建过程,确实会先去本地读取依赖包,从上面那个 Verifying availability ... 日志就可以看出。

这条日志说明会去本地 maven 仓库验证依赖包是否可用。

那么关键就在于,验证本地依赖包是否可用的依据到底是什么呢?

从整条日志的意思中可以大概猜测,它应该是去远程仓库中读取依赖包的信息来跟本地的进行验证,毕竟日志上有一个 from,很难不让人这么猜测。

那如果真是这样,这里的验证肯定就通不过了,因为远程仓库里并没有这几个依赖包(因为某些原因)。

然后,我在网络上搜索了 Verifying availability 关键词,找到了这么一篇:

maven创建离线本地仓库的坑之verifying availability

文章里说了,将本地仓库的依赖包目录下的 __remote.repositories 文件删掉,本地依赖包就可以正常使用了,尝试了下,确实可行,搞定!

好奇之下,搜索了相关资源,找到这些一些文章:

maven仓库中的LastUpdated文件生成原因及删除

使用Maven,即使存在*.lastUpdated文件也能更新jar文件的方法

看了下,大概就是说,maven 在下载依赖包过程中,如果因为某些原因没有成功下载,那么本地就会生成诸如 xxx.repositories 或 xxx.lastUpdated 之类的文件。

一旦本地有这些文件,那么就意味着本地的依赖包可能不完整,需要先进行验证是否可用,才能被使用。

那么,如何验证呢?自然就是再去这些临时文件中记载的远程仓库重新读取一遍依赖包的相关信息来跟本地比对,确认本地依赖包是否可用。

这也就是为什么,明明开启了 offline 离线模式,明明从其他人那里拷贝了相关依赖包到本地,但构建过程却依据需要联网的原因?因为你本地的依赖包里有这些临时文件,表明本地依赖包可能不是完整包,不能直接被使用,需要先进行验证,自然就需要联网了。

这也是本地有依赖包,但每次却又去远程仓库,然后找不到,又报异常的原因。

所以,结论就一点:

不是说,你本地 Maven 仓库里有依赖包,构建过程就可以优先被使用,你还要确保你本地的依赖包是完整、可用的才行。

如何确认呢?就是依赖包目录中,没有像 xxx.repositories 或 xxx.lastUpdated 之类的文件。

如果你能确保你的本地依赖包是完整、可用的,那手动将这些文件删掉,构建过程就不会再联网去远程仓库验证了,就可以优先使用本地依赖包了。

解决方案

本篇的背景所遇到的文件,解决方案就一句话:

将 Maven 本地仓库里,找同事拷过来的那个依赖包目录中,将 xxx.repositories 文件删掉,再重新构建项目即可。

至于想知其所以然,看上面分析那个小节的内容即可。

注:解决这类问题时,找准关键词,一般就能在网络上找到解决方案了。


大家好,我是 dasu,欢迎关注我的公众号(dasuAndroidTv),公众号中有我的联系方式,欢迎有事没事来唠嗑一下,如果你觉得本篇内容有帮助到你,可以转载但记得要关注,要标明原文哦,谢谢支持~

记 Maven 本地仓库埋坑之依赖包为何不能用的更多相关文章

  1. Maven——向Maven本地仓库中手动添加依赖包(ps:ojdbc.jar)

    maven中央仓库中并非包含所有现有的依赖包和插件,部分依赖包和插件需要手动地进行添加(如ojdbc.jar) 一.添加JDK系统环境变量(maven是基于Java的,可参考:https://www. ...

  2. 将第三方包安装到maven本地仓库

    今天在做jasper report生成pdf文档的时候,需要引入亚洲字体jar包.maven仓库是有这个jar包,但是在项目pom文件始终不能下载.无奈只有将jar包安装到maven本地仓库. 1 将 ...

  3. maven 本地仓库和远程仓库

    在Maven中,任何一个依赖.插件或者项目构建的输出,都可以称之为构件. Maven在某个统一的位置存储所有项目的共享的构件,这个统一的位置,我们就称之为仓库.(仓库就是存放依赖和插件的地方) 任何的 ...

  4. nexus 搭建maven本地仓库

    使用Nexus搭建Maven本地仓库   阅读目录 序 Nexus 序 在工作中可能存在有些开发机器不能上网,大量的机器获取jar包会导致公司网络很慢,还有时候公司会自己发布自己的项目版本,其他的项目 ...

  5. maven本地仓库.m2文件夹路径讲解

    Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Depen ...

  6. 如何将 jar 包导入Maven 本地仓库

    案例:oracle jar包由于在maven 远程仓库中找不到,需要先将oracle jar 文件下载到本地,然后导入maven本地仓库,就可以通过 pom 进行依赖 例如:下载后的 jar 地址 D ...

  7. intellij idea使用maven本地仓库及修改本地仓库路径

    什么maven本地仓库,默认是用户目录下的.m2/repository这个文件. idea是自带maven插件的不用我们再,怎么把依赖包下载到我们的本地仓库呢?一般是idea默认了路径,而且idea是 ...

  8. 手动安装jar包到Maven本地仓库

    接手别人的一个项目,Maven工程,导入后,某些jar包找不到,然后从同事那复制Maven本地仓库的文件夹到我的电脑,发现依旧找不到.问题大致总结为:本地maven仓库存在jar,但是依然报Missi ...

  9. Maven 本地仓库

    概述 Maven 的本地资源库是用来存储所有项目的依赖关系(插件 Jar 和其他文件,这些文件被 Maven 下载)到本地文件夹.很简单,当你建立一个 Maven 项目,所有相关文件将被存储在你的 M ...

随机推荐

  1. dede tag标签静态化

    看回那2个文件夹即可,txt说明书我已经修改过. 下面说一下tag标签静态化之后在内容页.列表页中如何使用. 内容页中沿用之前的方法即可: {dede:tag sort='new' getall='0 ...

  2. Scala 学习笔记之集合(9) 集合常用操作汇总

    object CollectionDemo10 { def main(args: Array[String]): Unit = { var ls = List[Int](1, 2, 3) //向后增加 ...

  3. FFmpeg(三) 编解码相关函数理解

    一.编解码基本流程 主要流程: 打开视频解码器(音频一样) 软解码.硬解码 进行编解码 下面先来看打开视频解码器 ①avcodec_register_all()//初始化解码 ②先找到解码器. 找解码 ...

  4. 执行Django数据迁移,报错 1091

    问题描述 今天在Pycharm 中的Terminal下,执行数据迁移操作时,第一步: Python manage.py makemigrations ,是没有任何问题,但就是在执行真正的数据迁移时,也 ...

  5. redis在mac上的下载安装

    redis官网下载压缩包: 在终端进入下载后的目录,然后: 解压:tar zxvf redis-5.0.5.tar.gz 移动到:sudo mv redis-5.0.5 /usr/local 切换到: ...

  6. mapper插入时显示中文

    可能是jdbc url需要加characterEncoding=utf-8,例 jdbc:mysql://localhost:3306/smbms?characterEncoding=utf8

  7. GUI tkinter (pack、grid、place)布局篇

    """1.其实我们已经接触过 tkinter 的一种布局,就是 pack 布 局,它非常简单,我们不用做过多的设置,直接使用一个 pack 函数就可以了.2.grid 布 ...

  8. 前端开发 JavaScript 干货知识点汇总

    很多初学的朋友经常问我,前端JavaScript都需要学习哪些东西呀?哪些是JavaScript的重点知识啊? 其实做前端开发工程师,所有的知识点都是我们学习必备的东西,只有扎实的技术基础才是高薪的关 ...

  9. AWD脚本之批量mysql写shell

    摘之工具包中脚本 需要安装mysqldb.windwos环境直接在https://www.codegood.com/archives/129下载MySQL-python-1.2.3.win-amd64 ...

  10. ‎Cocos2d-x 学习笔记(23) 分辨率与屏幕适配

    Cocos2d-x的分辨率可以分为两种:屏幕分辨率和设计分辨率. 屏幕分辨率就是屏幕窗口的大小,单位是像素. 设计分辨率单位是点,一个点可能包括多个像素. 如果把一台显示器自身的分辨率比作屏幕分辨率的 ...