美文网首页
解决Maven错误:Failed to read artifac

解决Maven错误:Failed to read artifac

作者: 重案组知乎 | 来源:发表于2019-11-30 21:32 被阅读0次

    今天要把一个工程改为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,很容易让人误入歧途,在外围打转而找不到原因。

    经验总结:

    1. pom文件报错意味着pom本身有错误,不要把时间消耗在调查jar包为什么下载不下来上。因为版本号错误等原因找不到jar包的错误提示是:Missing artifact xxx.jar,而本次错误的提示多了一条Failed to read artifact descriptor for xxx.jar,其含义是根本无法读取包的描述信息,其实也就是pom本身有问题啦(本例就是pom不完整)!
    2. 不要只看错误标题,而要观察完整的错误堆栈信息。这次问题的解决完全是依靠错误堆栈信息的。提醒自己,写程序一定要多写日志,关键时刻能救命!
    3. 学到了用import方式解决maven单继承问题的新知识。

    相关文章

      网友评论

          本文标题:解决Maven错误:Failed to read artifac

          本文链接:https://www.haomeiwen.com/subject/qjhqfctx.html