今天要把一个工程改为Maven结构,其中有个阿里云的包ons-client-1.7.2.Final.jar
,在中央库上能搜到,于是直接添加依赖:
<dependencies>
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>ons-client</artifactId>
<version>1.7.2.Final</version>
</dependency>
可是,pom文件竟然出错了,jar包也没有自动下载。
pom文件报错
难道是中央库有错误?上中央库直接查看却是正常的,jar、源码、javadoc齐全,能直接下载,但开发环境的依赖就是不行。把jar直接拷贝到机器本地仓库中,仍然显示pom错误。
试着改了其他版本号,发现1.7.1可以,1.7.2~1.7.4不行,从1.7.5开始又可以了,看来是阿里云上传的文件有问题啊...换一般人,估计也就心里骂一句阿里,然后改个版本号了事。但我能是一般人吗?我是有强迫症的人!到底什么导致的必须搞清楚!
各种尝试过程按下不表,最后仔细端详下面这个报错窗口:
Eclipse Problem窗口
发现第一条错误是有错误堆栈Tip的,于是右键拷贝,粘贴到笔记本中,有了重大发现,错误堆栈的最下面是这样的:
Caused by: org.eclipse.aether.transfer.ArtifactNotFoundException: Failure to find com.alibaba.security:security-spring-dependencies:pom:1.0.0-SNAPSHOT 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 has elapsed or updates are forced
at org.eclipse.aether.internal.impl.DefaultUpdateCheckManager.newException(DefaultUpdateCheckManager.java:231)
at org.eclipse.aether.internal.impl.DefaultUpdateCheckManager.checkArtifact(DefaultUpdateCheckManager.java:206)
at org.eclipse.aether.internal.impl.DefaultArtifactResolver.gatherDownloads(DefaultArtifactResolver.java:585)
at org.eclipse.aether.internal.impl.DefaultArtifactResolver.performDownloads(DefaultArtifactResolver.java:503)
at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:421)
... 49 more
pom.xml /test line 1 Maven Dependency Problem
这里清晰地表明,罪魁祸首是Failure to find com.alibaba.security:security-spring-dependencies:pom:1.0.0-SNAPSHOT
。赶紧到中央库找一下security-spring-dependencies
,果不其然,根本找不到。
试着切换到正常的1.7.5,在本地库中也并没有发现security-spring-dependencies
的存在,但不会报错。这是何故呢?
有了方向就好办,经过一番探查,发现ons-client的父项目ons-parent的pom文件中,1.7.2和1.7.5的版本有些差异:
版本差异
试着把本地库1.7.2版本多出来的这一行去掉,果然错误立刻消失。
那么,多出来的这一行究竟是干什么的呢?以前没接触过。搜了一下,这篇文章讲的不错:maven中import scope依赖方式解决单继承问题的理解。
现在可以结案了:阿里云的ons-client 1.7.2
版本的父项目ons-parent
在使用<dependencyManagement>
预定义依赖时,使用了import
方式导入security-spring-dependencies
,这就让Eclipse试图下载security-spring-dependencies的pom,而因为阿里并没有发布这个pom,Eclipse下载失败,就报pom有错。因为报错对象是ons-client,很容易让人误入歧途,在外围打转而找不到原因。
经验总结:
- pom文件报错意味着pom本身有错误,不要把时间消耗在调查jar包为什么下载不下来上。因为版本号错误等原因找不到jar包的错误提示是:
Missing artifact xxx.jar
,而本次错误的提示多了一条Failed to read artifact descriptor for xxx.jar
,其含义是根本无法读取包的描述信息,其实也就是pom本身有问题啦(本例就是pom不完整)! - 不要只看错误标题,而要观察完整的错误堆栈信息。这次问题的解决完全是依靠错误堆栈信息的。提醒自己,写程序一定要多写日志,关键时刻能救命!
- 学到了用import方式解决maven单继承问题的新知识。
网友评论