本文主要记录一次本机maven仓库明明存在,但是程序依然提示加载不到报错的解决,仅针对自己遇到的情况整理记录,未全面探索,存在其他情况,解决思路、办法等,请讨论、共享学习。
背景- 纯内网环境开发
- 部分依赖是厂商内部jar包,无法互联网加载
- 将厂商开发本项目相关依赖从开发人员本机仓库文件打包复制
问题解决从厂商开发人员那复制本地依赖仓库是因为部分依赖无法互联网加载,
1、确定基本配置
1.1、本机仓库目录配置,maven配置文件 setting.xml
<localRepository>/path/to/dir</localRepository>
这个目录要与复制过来的仓库文件解压的目录一致
1.2、本机镜像ID配置,maven配置文件 setting.xml
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>localRepository</name>
<url>file:///path/to/dir</url>
</mirror>
针对存内网环境,url 需要配置成本地
请记住这个 id ,这个 id 会影响多个文件。比如_remote.repositories,maven-metadata-xxx.xml
因为仓库文件是自从其他地方直接拷贝过来的,所以,这里边配置的 id 值与当时生成仓库文件对应的 id 值很可能不一样
2、遇到的问题
2.1、提示不存在maven-metadata-xxx.xml,其中 xxx 为上边的 id 的值
这个问题,可以通过尝试以下两个方向排查解决:
a、将镜像 id 改为与复制过来本地仓库生成的镜像 id 一致(比如在提示的不能存在目录里有文件 maven-metadata-central.xml中的 central);
b、在提示的目录里找到一个已经存在的复制另存一份,并调整 id 值,比如将maven-metadata-central.xml 复制存储为 maven-metadata-nexus-aliyun.xml,“nexus-aliyun”根据实际情况调整为自己配置的 id
如果这里按照 a 方法处理了,基本上不会遇到下边的问题了
2.2、提示某个依赖 jar 或者 pom 不存在,实际本地仓库目录对应文件是存在的
这类问题,可以通过以下几个方向排查解决
a、检查缺少文件目录里的 _remote.repositories 文件(文件内容一般入下图所示),文件类型是 jar 的话,一般 xxx.pom 和 xxx.jar 会成对出现,参照内容,成对复制,然后将 > 与 = 之间的值改为自己配置的镜像 id (1.2 中的 id)
_remote.repositories 文件内容
b、另一个方法,是将 _remote.repositories 这个文件删掉
_remote.repositories 这个文件里边记录了本地仓库中依赖的来源,maven加载依赖时会根据自己配置的镜像 id 检查是否加载过,若没加载过,则会提示不存在。
note:如果自己配置的本地镜像 id 与复制过来的仓库文件生成时的id不一样, 基本上程序依赖的每个jar包都会提示不存在或者其他问题,可以考虑将 2.1 中 a 办法,或者将 _remote.repositories 文件批量删除(保险起见可以批量重命名为其他,效果去删除一样)。