2017/3/14 | 周二 | 晴
背景
今天在浙江图书馆看Spring官方的一个Guide:Using WebSocket to build an interactive web application。把网页上的类copy下来之后,却暴露出一堆类解析失败的警告,像下面这个样子:
这种问题,就是当前项目的classpath里没有这些包或类。
排查
不应该啊,像Controller
已经不知道用了多少次了,难道是没有引入依赖?我先打开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查了下,查到了:
我把这个仓库也添加到镜像里了:
<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窗口也可以查看依赖关系。