美文网首页程序员maven
网络问题导致maven依赖解析失败的排查过程

网络问题导致maven依赖解析失败的排查过程

作者: heyikan | 来源:发表于2017-03-14 14:16 被阅读883次

    2017/3/14 | 周二 | 晴


    背景

    今天在浙江图书馆看Spring官方的一个Guide:Using WebSocket to build an interactive web application。把网页上的类copy下来之后,却暴露出一堆类解析失败的警告,像下面这个样子:

    类解析异常

    这种问题,就是当前项目的classpath里没有这些包或类。

    排查

    不应该啊,像Controller已经不知道用了多少次了,难道是没有引入依赖?我先打开IDEA上的Maven窗口:

    IDEA Maven

    你所看到的已经是问题解决之后的情况了,最初的情况依赖树下最顶层的7个包,左边都没有三角图标,表示它们都没有子依赖。而且sockjs-client和stomp-websocket都是像现在这样有红线标识。

    添加仓库镜像

    我首先注意到了被标了红线的sockjs-client和stomp-websocket,去本地仓库查看,对应的路径下确实没有jar包。我又查看了下settings.xml中配置的仓库镜像:

        <mirror>
          <id>alimaven</id>
          <name>aliyun maven</name>
          <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
          <mirrorOf>central</mirrorOf>        
        </mirror>
    

    这是我之前为了加快下载依赖的速度,配置了阿里云的仓库。我去这个仓库地址去找,果然没有org.webjars的项目。

    然后我又去maven repository查了下,查到了:

    sockjs-client

    我把这个仓库也添加到镜像里了:

    <mirror>
      <id>central</id>
      <name>central maven</name>
      <url>http://central.maven.org/maven2/</url>
      <mirrorOf>central</mirrorOf>        
    </mirror>
    

    然后刷新Maven依赖,虽然那两个依赖下红线依旧,但是本地仓库里确实把jar下载下来了。

    后来重新打开项目,那两个依赖的警戒线就消失了。

    身份认证

    但是问题依然没有解决,我又检查了本地仓库的spring-boot-starter-websocket,jar包是有的,但是打开pom.xml看到的内容却是这样的:

    <html>
    <head>
    <script type="text/javascript">location.href="http://10.18.8.82:8080/portal?userip=10.18.137.166&ssid=zjlib-guest&usermac=58-FB-84-0D-38-74&userurl=http://maven.aliyun.com/nexus/content/groups/public/org/webjars/bootstrap/3.3.7/bootstrap-3.3.7.pom"</script>
    </head>
    <body>
    Authentication is required. Click <a href="http://10.18.8.82:8080/portal?userip=10.18.137.166&ssid=zjlib-guest&usermac=58-FB-84-0D-38-74&userurl=http://maven.aliyun.com/nexus/content/groups/public/org/webjars/bootstrap/3.3.7/bootstrap-3.3.7.pom">here</a> to open the authentication page.
    </body>
    </html>
    

    毕竟看过这么多pom文件了,一眼看出这是有问题的。当时也没多想,直接把本地仓库下那个项目的目录干掉了,然后在IDEA刷新Maven依赖,重新下载。再打开下载之后的pom.xml,正常了,而Maven窗口的spring-boot-starter-websocket下的子依赖也显示出来了:

    子依赖

    我又查了其他几个依赖,发现都有这个问题,pom文件里莫名其妙的内容。我打开了pom文件中的地址,结果是这样子:

    被拦截

    原来如此,因为我使用的是图书馆的zjlib-guest这个wifi。这个wifi是为游客准备的,每隔一段时间就需要用户重新验证身份。我下载依赖的请求都被它给拦截了,结果确实下载了依赖,但是pom文件的内容是有问题的。这个时候即使网络问题已经不存在了,因为本地仓库已经有了pom文件,maven也不会重新下载。我只有手动删除对应的项目,maven才会去重新下载。

    图书馆的wifi

    图书馆为注册用户准备的wifi是zjlib-web,但是这个wifi实在太堵。

    收集整理

    在这一次排查的过程中,我认知到了以下几点:

    • 阿里云的Maven仓库是不完整的。
    • 网络问题可以产生错误的pom文件,而一旦错误的pom文件已经存在,就必须手动删除,才能重新下载。
    • 使用IDEA 的Maven窗口也可以查看依赖关系。

    相关文章

      网友评论

        本文标题:网络问题导致maven依赖解析失败的排查过程

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