玄学Maven-怎么这么难搞(持续更新...)

500 阅读6分钟

Maven对于后端开发人员来说是一个噩梦,尤其是在早期没有使用SpringBoot的情况下。其他问题虽然复杂困难,但解决起来并没有Maven那么充满玄学。
Maven的玄学问题很容易让人崩溃,两个小时解决不了的Maven报错,可能最后重启就好了。最近,在搞公司之前的老平台项目,老平台是一个多模块项目,各个模块互相依赖,其中又有第三方那个的依赖,我先找了一个最简单的模块,本地运行时没问题,但是打包时,又开始报依赖找不到,而且神奇的是报找不到的包,可以通过鼠标点进去找到对应文件,无论怎么清理本地maven库和重新加载依赖,都没办法解决,遂搁置,结果两天之后再打包就成功啦。
网上也有类似的感慨:“最大的感受就是框架不难搭建,最难的是各种依赖的导入。曾一度陷入各种玄学现象,不可自拔,也因此对于框架的学习有了深深的阴影。”,我也曾被Maven搞得一度要放弃后端啦,学习框架的时间全被消耗到了Maven上。
现在整理一下Maven遇到的问题,作为资料供后期查询,希望再次搭建Maven项目时能少浪费一些时间。

Maven库国际常用地址:mvnrepository.com/repos

一、Maven的setting.xml

确定maven配置文件的配置是否正确; IDEA中Maven配置文件位置在

image.png 在文件夹找到setting.xml文件,检查里面配置的Maven库地址是否正确。

  • 配置本地仓库
<localRepository>G:/MavenLocalRepository</localRepository>
  • 镜像库 如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。换句话说,任何一个可以从仓库Y获得的构件,都能够从它的镜像中获取。 举个例子,http://maven.net.cn/content/groups/public/是中央仓库http://repo1.maven.org/maven2/在中国的镜像,由于地理位置的因素,该镜像往往能够提供比中央仓库更快的服务。因此,可以配置 Maven 使用该镜像来替代中央仓库。
<mirrors>
	<mirror>
		<id>alimaven</id>
		<name>aliyun maven</name>
		<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
		<mirrorOf>central</mirrorOf>
	</mirror>
</mirrors>

该例中,<mirrorOf>的值为central,表示该配置为中央仓库的镜像,任何对于中央仓库的请求都会转至该镜像,用户也可以使用同样的方法配置其他仓库的镜像。另外三个元素id、name、url与一般仓库配置无异,表示该镜像仓库的唯一标识符、名称以及地址。类似地,如果该镜像需要认证,也可以基于该id配置仓库认证。

虽然mirrors可以配置多个子节点,但是它只会使用其中的一个节点,即默认情况下配置多个mirror的情况下,只有第一个生效,只有当前一个mirror无法连接的时候,才会去找后一个。 而我们想要的效果是:当a.jar在第一个mirror中不存在的时候,maven会去第二个mirror中查询下载,但是maven的<mirror>配置无法实现这个效果。

二、常用解决方法集合

1、重启IDEA

  • IDEA不展示Profiles 调整配置文件后,IDEA的Maven不展示Profiles,需要重启IDEA;

image.png

2、批量删除*.lastUpdated

maven库执行命令, powershell运行有问题,用老的命令框 for /r %i in (*.lastUpdated) do del %i

3、删除依赖整个文件夹

这种方式用于只删除.lastUpdated文件不能解决问题的情况。 找到该依赖在本地库的位置,直接删除这个依赖的文件夹,重新下载依赖即可。

4、手动下载依赖

通过多次刷新依旧无法下载的依赖,可以通过手动方式进行下载; 下载地址:mvnrepository.com 下载操作:

  1. 根据依赖名称进行搜索

image.png 2. 选择对应版本

image.png 3. 查看对比

image.png

image.png 4. 下载缺少的文件 image.png

三、各种依赖报错集合

install时依赖报错

1、Could not resolve dependencies for project XXX

报错信息:

Failed to execute goal on project myProjectName: Could not resolve dependencies for project myProjectName2:jar:1.0.0-SNAPSHOT: Failed to collect dependencies at com.taobao.diamond:diamond-client:jar:2.0.5.3.taocode-SNAPSHOT: Failed to read artifact descriptor for com.taobao.diamond:diamond-client:jar:2.0.5.3.taocode-SNAPSHOT: Could not find artifact com.taobao.diamond:diamond-all:pom:2.0.5.3.taocode-20210122.005057-1

报错信息2:

[ERROR] Failed to execute goal on project myProjectName: Could not resolve dependencies for project myProjectName2:jar:1.0.0-SNAPSHOT: The following artifacts could not be resolved: kettle.1-6:commons-codec:jar:1.9, kettle.1-6:commons-lang:jar:2.6, kettle.1-6:commons-lang3:jar:3.0, kettle.1-6:commons-logging:jar:1.1.3, kettle.1-6:commons-vfs2:jar:2.1-20150824, kettle.1-6:guava:jar:17.0, kettle.1-6:js:jar:1.7R3, kettle.1-6:jsch:jar:0.1.46, kettle.1-6:kettle-core:jar:6.0.1.0-386, kettle.1-6:kettle-engine:jar:6.0.1.0-386, kettle.1-6:metastore:jar:6.0.1.0-386, kettle.1-6:mysql-connector-java:jar:bin:5.1.21, kettle.1-6:ojdbc:jar:6, kettle.1-6:pentaho-vfs-browser:jar:6.0.1.0-386: Failure to find kettle.1-6:commons-codec:jar:1.9 in http://XXX/nexus/content/groups/public/ was cached in the local repository, resolution will not be reattempted until the update interval of myRep has elapsed or updates are forced -> [Help 1]

以上两类报错,都可以通过下面方法处理: 找到该依赖在本地库的位置,直接删除这个依赖的文件夹,重新加载依赖即可。(只删除.lastUpdated文件不能解决问题)

2、Could not find artifact

image.png 直接在repo1、aliyun都搜索不到该依赖;

image.png

image.png 在mvnrepository.com中可以搜索到;

image.png 解决办法:参考【手动下载依赖】章节

3、unexpected markup <!d (position: START_DOCUMENT

unexpected markup <!d (position: START_DOCUMENT seen <!d... @1:3)

image.png 点击clean,执行失败,执行结果只有Process terminated 执行过程和报错信息一闪而过,这就需要快速截取一下,确定报错原因

image.png 根据信息,确定具体依赖,然后找到本地库该依赖的文件,和maven库的进行对比,发现少了两个。 解决办法:参考【手动下载依赖】章节