本文由HollisChuang 翻譯自 The Top 100 Java Libraries in 2017 - Based on 259,885 Source Files . 原做者:Henn Idanjava
一年的時間就這麼匆匆過去了,就好像像咱們昨天才剛剛從GitHub上分析了2016年的Top Java類庫同樣。今年,咱們在數據檢索方面採用了Google的BigQuery,來獲得更精確的結果。android
譯者注:BigQuery 是 Google 專門面向數據分析需求設計的一種全面託管的 PB 級低成本企業數據倉庫。該服務讓開發者可使用Google的架構來運行SQL語句對超級大的數據庫進行操做。BigQuery 可在幾秒內掃描 1 TB 的數據,在幾分鐘內掃描 1 PB 的數據。git
首先,咱們按照star數排名,從GitHub上拉取了前1000份Java代碼倉庫,而後過濾掉Android項目,剩下477個純Java項目。github
咱們基於這477個純Java項目進行了分析。咱們去重以後統計了全部的類庫的import。更深刻的關於統計方法的介紹在文章底部。web
廢話很少說,讓咱們來看看2017年最受歡迎的Java類庫都有哪些?今年又是誰穩坐第一的寶座。spring
和去年同樣,排名第一的類庫,依舊是JUnit
。基於它擴展的 JUnit Runner
佔據第二名的位置,甚至是較舊的 junit.framework
這次也在第三名的位置。也就是說JUnit
包攬了前三甲。數據庫
Mockito
,這個開源的mock測試框架排名第四。apache
譯者注:Mockito 是一個強大的用於 Java 開發的模擬測試框架, 經過 Mockito 咱們能夠建立和配置 Mock 對象, 進而簡化有外部依賴的類的測試.編程
Java中的日誌組建 slf4j
位列第五。這從某個側面體現出目前的開發人員對日誌仍是比較情有獨鍾的。同時也看得出Java開發人員對於 java.util.logging
庫的使用率較低。咱們也曾經分析過Java開發者使用日誌的一些習慣和偏好。整理在eBook中。架構
Hamcrest
類庫排名的上升,說明了開發人員確實是須要更好的測試環境。
譯者注:Hamcrest是一個協助編寫用Java語言進行軟件測試的框架。它支持建立自定義的斷言匹配器(assertion matchers)(名稱「Hamcrest」即爲「matchers」的異位構詞),容許聲明式定義匹配規則。這些匹配器在單元測試框架(例如JUnit和jMock)中有用。
分析排名在前幾名的類庫咱們發現,測試對於寫出更好的代碼是十分重要的。這也就說明了一個事實,出現線上問題是開發者最不想看到的,因此咱們會想盡一切辦法去避免他的發生。(這部分還有一些關於做者網站的廣告,我就不翻譯了。)
Google的Guava
類庫排名第 7。 最受歡迎的JSON類庫是Jackson
。 榜單第20名,是一個新晉類庫:org.w3c.dom
。它提供了一系列操做DOM的接口。
縱觀前100名,咱們發現Spring 有很好的表現。如下8個類庫進入前100 :
#57 – org.springframework.beans.factory.annotation
#60 – org.springframework.context
#65 – org.springframework.context.annotation
#66 – org.springframework.stereotype
#68 – org.springframework.util
#81 – org.springframework.test.context.junit4
#85 – org.springframework.beans.factory
#91 – org.springframework.web.bind.annotation
複製代碼
除了Spring以外,Apache的類庫也有普遍的應用:
#16 – org.apache.commons.io
#22 – org.apache.http
#24 – org.apache.commons.lang
#25 – org.apache.http.impl.client
#30 – org.apache.http.client
#33 – org.apache.http.client.methods
#34 – org.apache.log4j
#35 – org.apache.commons.codec.binary
#45 – org.apache.commons.lang3
#53 – org.apache.http.entity
#61 – org.apache.http.util
#64 – org.apache.commons.logging
#75 – org.apache.http.message
#88 – org.apache.zookeeper
#95 – org.apache.hadoop.conf
#98 – org.apache.http.client.config
#100 – org.apache.http.client.utils
複製代碼
譯者注:看到apache類庫有這麼好的表現,筆者比較開心。筆者一直崇尚不要重複製造輪子,咱們平常開發中可能用到的一些方法在apache的類庫中具備最佳實現。好比處理IO流、處理集合等。
在今年的排名中,AssertJ較去年有明顯的提高,它爲 Java 提供了流式斷言(Fluent assertions)。今年它攀升至 50 名。
咱們在榜單中也發現了 javax.script
和 org.apache.http.client.utils
這兩個腳本API。
腳本API供那些但願在其 Java 應用程序中執行用腳本語言編寫的程序的應用程序編程人員使用。
文章開通咱們說起過,今年咱們使用Google的BigQuery來處理數據。咱們經過GitHub提供的API拉取了1000份倉庫代碼。在過濾掉Android、Arduino和一些過期的倉庫後,咱們還剩餘259,885份Java源文件。咱們對同一個倉庫中使用的類庫進行去重後,還剩餘25,788份類庫。
咱們實際是怎麼作的呢?
首先,咱們建立一個倉庫表,用來存儲star數排名靠前的哪些類庫,命名爲java_top_repos_filtered
:
SELECT
full_name
FROM
java_top_repos_1000
WHERE NOT ((LOWER(full_name) CONTAINS 'android') OR
(LOWER(full_name) CONTAINS 'arduino'))
AND ((description IS null) OR
(NOT ((LOWER(description) CONTAINS 'android') OR
(LOWER(description) CONTAINS 'arduino') OR
(LOWER(description) CONTAINS 'deprecated'))));
複製代碼
如今,咱們有了排名靠前的類庫的名字,而後咱們把他們都拉取下來:
SELECT
repo_name,
content
FROM
[bigquery-public-data:github_repos.contents] AS contents
INNER JOIN
(
SELECT
id,
repo_name
FROM
[bigquery-public-data:github_repos.files] AS files
INNER JOIN
java_top_repos_filtered AS top_repos
ON
files.repo_name = top_repos.full_name
WHERE
path LIKE '%.java'
) AS files_filtered
ON
contents.id = files_filtered.id;
複製代碼
至此,咱們有了每一個項目的源代碼,咱們就要把去重後的import的語句過濾出來,而後在提取包名稱。
SELECT
package,
COUNT(*) count
FROM
( //extract package name (exclude last point of data) and group with repo name (to count each package once per repo)
SELECT
REGEXP_EXTRACT(import_line, r' ([a-z0-9\._]*)\.') package,
repo_name
FROM
( //extract only 'import' code lines from *.java files
SELECT
SPLIT(content, '\n') import_line,
repo_name
FROM
java_relevant_data
HAVING
LEFT(import_line, 6) = 'import'
)
GROUP BY
package,
repo_name
)
GROUP BY
package
ORDER BY
count DESC;
複製代碼
最後,咱們再進行一次過濾,確保沒有Android, Arduino、過期的或者Java提供的原生的類庫。
SELECT
*
FROM
java_top_package_count
WHERE
NOT ((LEFT(package, 5) = 'java.') OR
(LOWER(package) CONTAINS 'android'))
ORDER BY
count DESC;
複製代碼
至此,你就獲得了一份2017年排名Top 100的Java類庫的列表了。
一個主要的結論是:那些2016年受歡迎的類庫,在2017年依舊受歡迎。這也說明,這些類庫背後的開發者、團隊或者公司都在努力的使這些類庫更好。
這也意味着,若是你打算開始寫本身的Java項目,或者平常的開發中,咱們的電子表格能夠提供一些好的建議。這些排名靠前的類庫是不錯的選擇。