2017/3/14 | 周二 | 晴
背景
今天在浙江圖書館看Spring官方的一個Guide:Using WebSocket to build an interactive web application。把網(wǎng)頁上的類copy下來之后,卻暴露出一堆類解析失敗的警告,像下面這個樣子:
這種問題,就是當前項目的classpath里沒有這些包或類。
排查
不應該啊,像Controller
已經(jīng)不知道用了多少次了,難道是沒有引入依賴?我先打開IDEA上的Maven窗口:
你所看到的已經(jīng)是問題解決之后的情況了,最初的情況依賴樹下最頂層的7個包,左邊都沒有三角圖標,表示它們都沒有子依賴。而且sockjs-client和stomp-websocket都是像現(xiàn)在這樣有紅線標識。
添加倉庫鏡像
我首先注意到了被標了紅線的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看到的內(nèi)容卻是這樣的:
<html>
<head>
<script type="text/javascript">location.</script>
</head>
<body>
Authentication is required. Click <a >here</a> to open the authentication page.
</body>
</html>
畢竟看過這么多pom文件了,一眼看出這是有問題的。當時也沒多想,直接把本地倉庫下那個項目的目錄干掉了,然后在IDEA刷新Maven依賴,重新下載。再打開下載之后的pom.xml,正常了,而Maven窗口的spring-boot-starter-websocket
下的子依賴也顯示出來了:
我又查了其他幾個依賴,發(fā)現(xiàn)都有這個問題,pom文件里莫名其妙的內(nèi)容。我打開了pom文件中的地址,結(jié)果是這樣子:
原來如此,因為我使用的是圖書館的zjlib-guest這個wifi。這個wifi是為游客準備的,每隔一段時間就需要用戶重新驗證身份。我下載依賴的請求都被它給攔截了,結(jié)果確實下載了依賴,但是pom文件的內(nèi)容是有問題的。這個時候即使網(wǎng)絡問題已經(jīng)不存在了,因為本地倉庫已經(jīng)有了pom文件,maven也不會重新下載。我只有手動刪除對應的項目,maven才會去重新下載。
圖書館的wifi
圖書館為注冊用戶準備的wifi是zjlib-web,但是這個wifi實在太堵。
收集整理
在這一次排查的過程中,我認知到了以下幾點:
- 阿里云的Maven倉庫是不完整的。
- 網(wǎng)絡問題可以產(chǎn)生錯誤的pom文件,而一旦錯誤的pom文件已經(jīng)存在,就必須手動刪除,才能重新下載。
- 使用IDEA 的Maven窗口也可以查看依賴關(guān)系。