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

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窗口也可以查看依赖关系。

推荐阅读更多精彩内容

  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 37,175评论 5 339
  • |-1-更新内容[6.从仓库解析依赖的机制(重要)] 1Maven仓库作用 仓库用来存储所有项目使用到构件,在ma...
    zlcook阅读 4,189评论 0 25
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 103,863评论 12 125
  • Maven简单介绍 Maven是一个项目管理工具。强大,但是很容易使用。 它包含了: 一个项目对象模型 (Proj...
    高公子Daniel阅读 3,073评论 4 60
  • 《指环王3: 王者归来》衔接第二部也是呈现双线发展格局。佛雷多与山姆经过千辛万苦终于摧毁了魔戒。 而甘道夫、阿拉冈...
    雅雅9527阅读 199评论 0 0