一個SDK給我幹懵逼了?大廠的SDK就這?

小猿來也發表於2021-07-06

活久見 。org.jboss.netty 和 io.netty 你分的清嗎?

大家好,我是小猿來也,一個熱衷寫 bug 的程式猿。

一天我正在專心致志寫 Bug 的時候,一個同事跑過來找我。

說有個很特別三方依賴庫的 jar 包,裡面有一些 netty 的依賴,但是無法確定 netty 的具體版本,讓我幫忙給看看。

還有這事兒?

於是就讓他把 jar 發來看看,收到後我就趕緊給它解壓了,它的目錄結構是下面這樣的:

原來某寶、某釘的 SDK 就長這樣?
大廠的SDK就這?

當時我就

這完全不按套路出牌呀,pom 檔案哪裡去了呢?gradle 檔案哪裡去了?這是什麼黑科技呢?

盯著這個 jar 包解壓之後的檔案目錄,翻來覆去好幾遍,也沒發現相關依賴庫的座標宣告檔案。

於是就問問同事有沒有原始檔,他說有,麻溜的發了過來,比平時喊他吃飯都快。

我開啟一看,依然啥都沒有。

頓時覺得這個類庫有點不一樣!

沒有依賴庫的座標,怎麼確定依賴庫的版本呢?

同事那邊還在催,只能先把這個類庫為什麼沒有依賴庫的座標這個點放一放。

然後就先用一個一個版本嘗試的方法來先幫他確定依賴的 netty 版本。

我隨便開啟了一個檔案,發現裡面有很多org.jboss.netty的依賴。

然後我就開啟了 Maven 的中央倉庫:https://mvnrepository.com 輸入了netty關鍵字進行搜尋。

搜尋結果前面很多都是io.netty的資訊,到了第7個才是org.jboss.netty的資訊,就是我上圖中圈出來的那個。

然後我就點了進去:https://mvnrepository.com/artifact/org.jboss.netty/netty


發現裡面提供的主要是 Netty3.0.x3.1.x3.2.x的版本。

基於常識專案裡引用 Netty 基本上都會引用Final的版本,所以我就在這個類庫的原始檔中加了一個 pom 檔案,先拿3.2.10.Final這個版本試了下。

<!-- https://mvnrepository.com/artifact/org.jboss.netty/netty -->
<dependency>
    <groupId>org.jboss.netty</groupId>
    <artifactId>netty</artifactId>
    <version>3.2.10.Final</version>
</dependency>

新增完上面的依賴座標資訊後,嘗試編譯原始碼,發現缺少org.jboss.netty.handler.codec.http.websocketx包。

然後分別試了3.1.5.GA缺少org.jboss.netty.handler.codec.http.websocketx包,3.0.0.GA缺少org.jboss.netty.handler.codec.http包。

也就是說3.0.x3.1.x3.2.x這個三個系列的版本里沒有合適的。

不死心的我又搜了一下整個中央倉庫裡,也沒能查到更多的關於org.jboss.netty的包。

所以到這裡 https://mvnrepository.com/artifact/org.jboss.netty/netty 這條路是死了。

但是中央倉庫中org.jboss.nettyhttps://mvnrepository.com/artifact/org.jboss.netty/netty 這個頁面中的一段說明引起了我的注意。

Note: This artifact was moved to:

io.netty » netty

對,就是上面這段話,我在下圖圈出了它。

它告訴我們org.jboss.netty >> netty已經遷移到了io.netty >> netty
而且它還提供了跳轉連結:https://mvnrepository.com/artifact/io.netty/netty ,所以我就點了進去。

進去後發現這個頁面裡歸檔了3.3.x3.10.x,以及4.0.x的 netty 製品。

我先拿3.10.6.Final試了下

<!-- https://mvnrepository.com/artifact/io.netty/netty -->
<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty</artifactId>
    <version>3.10.6.Final</version>
</dependency>

重新編譯之後發現所有的import都沒問題了,但是會有部分類的部分方法缺失。

這個時候感覺版本已經比較接近了相對正確的版本了,接下來就選了跟它最近的次新版本3.9.9.Final
編譯之後發現完全沒問題了,在3.10.6.Final中缺失(已被刪除的)的方法果然是在3.9.9.Final標記刪除的方法。

所以基本上可以認為3.9.9.Final極有可能是這個三方 jar 所依賴的 netty 的版本。

稍微有點兒意外的發現,就是在3.3.x3.10.x中雖然依賴座標中的 groupId 是 io.netty 但是實際的包路徑卻是 org.jboss.netty.xxx,也算是漲了知識啦。

然後就是 https://mvnrepository.com/artifact/io.netty/netty 這個頁面上同樣有一段說明

Note: This artifact was moved to:

io.netty » netty-all


就是上圖中我圈出的部分,就是說io.netty >> netty已經遷移到了io.netty >> all了。

同時這個在netty的官網中也有說明

好奇害死貓,所以我就又跑去 https://mvnrepository.com/artifact/io.netty/netty-all 這個頁面看了看。

我發現io.netty >> all中歸檔了4.0.x4.1.x以及最新的5.0.x

經過對比確認我發現在3.2.x及其之前的版本中 netty 的 groupId 是org.jboss.netty,artifactId 是netty,包路徑是org.jboss.netty

3.3.x3.10.x中 netty 的 groupId 是io.netty,artifactId 是netty,包路徑是org.jboss.netty

4.0.0.Final及其之後的版本中netty的 groupId 是io.netty,artifactId 是netty-all,包路徑是io.netty

version groupId artifactId package
<=3.2.x org.jboss.netty netty org.jboss.netty
3.3.x~3.10.x io.netty netty org.jboss.netty
=>4.0.0.Final io.netty netty-all io.netty

所以3.9.9.Final就是這個三方 jar 所依賴的 netty 的版本,應該符合預期。

然後就用同事發來的 jar 對應的原始碼加上我新增的 pom 檔案的資訊,快速重新打了個包發給了他去救火。

他測試一下,最終給的反饋是完全沒問題。

到這裡這次給一個無依賴座標的三方類庫專案確定 netty 依賴版本之旅就算結束了。

最後回到了文章開始的問題,你知道這種無明確依賴座標資訊的 jar 包是如何生成的呢?為什麼會有這種 jar 出現呢?它有什麼弊端嗎?

我們下一篇文章見!

相關文章