不知道大家发现了没有,自从2020年开始,maven仓库的拉取有位困难?
明明配置了阿里的镜像,或者华为的镜像,仍然无法拉取下来jar包,那么这一篇文章,开始慢慢分析者其中的坑。
首先,http协议改成了https协议,导致必须配置证书,我们以大家最优先选择的阿里镜像和华为镜像作为说明
阿里镜像及配置说明: https://help.aliyun.com/document_detail/102512.html?spm=a2c40.aliyun_maven_repo.0.0.36183054I5uPtH
一般配置的镜像为:
华为镜像及配置说明:https://mirrors.huaweicloud.com/(这里需要点开maven)
内容如下:
这里发现,只要是仓库地址,都是https,那么,我们就需要添加证书到我们的本地
如何生成证书呢?往下看
以华为maven镜像为例,进行演示
获取maven的镜像地址,访问它:https://mirrors.huaweicloud.com/repository/maven/
下载证书
接下来,把上面那步的(abc.cer)这个证书导入java中的cacerts证书库
使用命令:keytool -import -alias cacerts(证书名自定义) -keystore cacerts(证书存放位置) -file d:\mvn.cer(上一步保存的证书文件的位置)
keytool工具是JDK自带的工具(我使用的是JDK8,不知道JDK11带不带了)
导入的时候,需要先输入这个工具的密码(也可能是仓库密码,首次的话,需要自己设置)
问,是否信任此证书,需要输入“是”
我们可以使用此命令查看是否已经导入:keytool -list -keystore cacerts(这里的名字和上面自定义的一致)
此时就可以使用maven的阿里源或者华为源了。
那么现在开始解决第二个问题,为什么配置了阿里源或者华为源,仍然无法拉取jar,此处,以oracle的driver为例:
我们在maven仓库中找到了oracle的jar包
此时,引入这个坐标,你说能起作用嘛?显然不能!这还是一个比较浅的坑。
不知道大家有没有见过这个坐标
亦或者由于年代久远,有一些坐标已经没有办法拉取jar包了
这时候又该怎么办呢?
有两种办法,第一种,将jar导入maven仓库,使用此命令
mvn install:install-file -Dfile=jar包的位置(参数一) -DgroupId=groupId(参数二) -DartifactId=artifactId(参数三) -Dversion=version(参数四) -Dpackaging=jar
例如:
mvn install:install-file -DgroupId=ojdbc -DartifactId=ojdbc6 -Dversion=11.2.0.4 -Dpackaging=jar -Dfile=ojdbc6.jar
需要注意以下几点:
注意"-"不能缺少 install后面的"-"是没有空格的
注意"-Dfile"中jar包的路径和jar包的名字.
注意看cmd命令提示,查看本地repository中是否成功的复制了jar包
当然,这个办法,有时候基本失败居多,也有说法,是说新建一个pom文件,然后通过pom导入到maven仓库,反正也是可行性不高,你想,年代久远了,或者jar是某厂商自己的,maven仓库不可能有这个jar包了,导入失败是必然的吧(也可能有大神有什么神操作,我就不好意思说了)
那么,最后一招!!
既然maven拉不下来,怎么办??
还记得当年最开始,没有maven的时候是怎么做的嘛?
将jar添加到类路径中!
那么我们为什么不可以让maven和类路径共存呢?
恭喜你,maven已经有这样的插件,帮你做这个事情。
org.apache.maven.plugins maven-compiler-plugin 3.1 1.8 ./lib
我们使用maven的compile插件,将项目路径下的lib路径添加到maven的编译路径中,当我们使用mvn package时,maven就会将这个路径下的jar包一块儿打进来。
有人说,如果我不这么做呢?
那么你会发现,你的代码实际上是引用了你lib下的jar的方法的,但是maven找不到这个jar,如图
到这里,基本上就可以保证,你的maven可以拉下来的jar,和自己放入类路径的jar都被打包进去。
如果是多模块项目呢?
怎么找到自定义的类路径下的所有jar呢?
至此,maven的坑基本结束了,所以说,maven也不是十全十美的。只有知道它的不足,才能更加客观的运用它。