時間如流水,轉眼間2018年已經要接近尾聲了,過去的一年,能夠說是瘋狂的一年。SpaceX成功發射了重型獵鷹火箭,蘋果成爲首個突破一萬億美圓市值的上市公司。java
2018年,在IT圈也發生了許多大事和喜事,SpringBoot 2發佈、Java發佈了10 和 11兩個版本、GitHub下嫁MicroSoft、IBM迎娶RedHat等,和往年同樣,咱們分析了2018年排名Top 100的Java類庫。mysql
最近,OveOps公佈了The Top 100 Java Libraries in 2018 - Based on 277,975 Source Files,Hollis查看了這份榜單,作了翻譯和補充,向你展現2018年的風雲Java類庫,但願能夠給正在使用Java的你一些幫助和啓示。不能說榜單中的類庫都是最好的,可是至少是目前比較受歡迎的。android
2017年排名Top 100的Java類庫——在分析了259,885份源碼以後得出的結論git
2016年排名Top 100的Java類庫——在分析了47,251個依賴以後得出的結論github
今年,Top 100 Java類庫的排名發生了一個戲劇性的改變,榜首換人了,在此以前,JUnit
已經蟬聯了三屆冠軍。而今年,冠軍寶座被fasterXML/Jackson
佔據。 而這個類庫,2016年排名第14名、2017年排名第18名。web
Jackson是一個JSON庫,能夠方便的將JSON轉化成Java的對象模型,以及把Java的對象模型轉換成一串JSON。在往年的榜單中,Jackson就是全部JSON類庫中排名最靠前的。spring
Jackson所依賴的jar包較少,簡單易用而且性能也要相對高些,而且Jackson社區相對比較活躍,更新速度也比較快。具備如下特色:sql
去年包攬前三甲的JUnit家族三大成員JUnit
、JUnit Runner
和junit.framework
今年分別位列第3、第四和第五名。數據庫
今年排名第二名的是Apache Hadoop
,是一款支持數據密集型分佈式應用程序並以Apache 2.0許可協議發佈的開源軟件框架。它支持在商品硬件構建的大型集羣上運行的應用程序。Hadoop的框架最核心的設計就是:HDFS和MapReduce。HDFS爲海量的數據提供了存儲,而MapReduce則爲海量的數據提供了計算。apache
在咱們排名前20的庫中,咱們能夠找到Eclipse基金會的Jetty、Apache基金會的 Shiro 、Netty以及谷歌的Guice庫等。
Jetty
Jetty是一個純粹的基於Java的網頁服務器和Java Servlet容器。儘管網頁服務器一般用來爲人們呈現文檔,可是Jetty一般在較大的軟件框架中用於計算機與計算機之間的通訊。
Shiro
Apache Shiro是一個開源安全框架,提供身份驗證、受權、密碼學和會話管理。Shiro框架直觀、易用,同時也能提供健壯的安全性。
Netty
Netty 是一個基於NIO的客戶、服務器端編程框架,使用Netty 能夠確保你快速和簡單的開發出一個網絡應用,例如實現了某種協議的客戶、服務端應用。Netty至關於簡化和流線化了網絡應用的編程開發過程,例如:基於TCP和UDP的socket服務開發。
Guice
Guice是Google開發的一個輕量級,基於Java5(主要運用泛型與註釋特性)的依賴注入框架(IOC)。Guice很是小並且快。Guice是類型安全的,它可以對構造函數,屬性,方法(包含任意個參數的任意方法,而不只僅是setter方法)進行注入。
除此之外,前20名的榜單中,值得關注的還有開源日誌組件——ch.qos.logback
、專門用於代碼微基準測試的工具套件——org.openjdk.jmh
、
除此以外,咱們比較熟悉的apache旗下的不少經常使用類庫,如apache.commons.lang
、org.apache.ibatis
、org.apache.maven
、org.apache.http.client
、apache.commons.lang3
等也都在前20的榜單中。
爲了分析榜單的變化狀況,咱們對比了2017年top20的類庫和今年的類庫榜單。咱們發現,除了JUnit的使用減小之外,還有些類庫排名在降低,有些甚至從前二十名被擠出。
首當其衝的是去年位列第四和第五名的Mockito
和slf4j
,今年被無情的甩出了前20,分別位列第23名和25名。
去年咱們重點表揚的,排名第6的,幫助編寫用Java語言進行軟件測試的框架——Hamcrest
今年慘跌至第37名。
咱們在今年的結果中看到的最主要的事情是,一切均可以改變。位於榜單底部的庫可能會在接下來的一年中名列前茅。這就是爲何咱們在2018年的圖表中查看了一些不太受歡迎的類庫,並在2019年對它們進行跟蹤,如:
#85 org.objectweb.asm – A simple API for decomposing, modifying, and recomposing binary Java classes
#86 com.google.common.primitives – Google Guava Primitive Types
#87 com.datastax.driver – DataStax Java Driver for Apache Cassandra
#88 org.json – The data interchange format
#89 org.apache.commons.math3 – The Apache Commons Mathematics Library
#90 com.netflix.hystrix – A latency and fault tolerance library designed to isolate points of access to remote systems, services and 3rd party libraries.
複製代碼
每一年咱們都會從GitHub中提取頂級的Java庫,而後開始處理這些數據。因爲須要區分一個全部者之下的不一樣文件夾,因此這種處理的大部分工做都是手工完成的。這就是爲何在咱們的列表中有許多com.google.common庫以及org.springframework 和org.apache等等。
今年,咱們決定對頂級Java庫進行更普遍的研究,看看誰是頂級「全部者」。咱們合併了org.eclipse.XX,org.codehaus.YY,io.nedy.ZZ和相似的位於同一個組織下的類庫,而後咱們整理出了下面這份榜單:
位居榜首的,就是咱們都熟知的,也是在前20的榜單頻繁出現的apche基金會。
第二名:springframework 第三名:google 第四名:junit 第五名:eclipse
今年的這份榜單中,值得注意的是有一家來自中國的組織貢獻的類庫總數進入了前20,那就是上圖中排名第15的Alibaba
。(做爲一個阿里人,做者感到無比驕傲!!!)
在Top 100 Java類庫中,com.alibaba.otter
排名第85。otter是一個基於數據庫增量日誌解析,準實時同步到本機房或異地機房的mysql/oracle數據庫. 一個分佈式數據庫同步系統。
Alibaba做爲一家互聯網公司,過去得幾年在開源領域作出了不少卓越的貢獻。最近幾年,Alibaba向Apache基金會捐獻了多個重量級開源項目。如JStorm、RocketMQ、Dubbo、Weex等,相信這些項目必將在開源社區的滋養下成長的更加茁壯!!!
咱們提取數據和數字的方法與去年的方法類似。在OverOps R&D團隊的幫助下,咱們主要是用了谷歌的BigQuery和GitHub的API。咱們提取了前1000個存儲庫,從中提取了這些存儲庫使用的Java庫。
BigQuery 是 Google 專門面向數據分析需求設計的一種全面託管的 PB 級低成本企業數據倉庫。該服務讓開發者可使用Google的架構來運行SQL語句對超級大的數據庫進行操做。BigQuery 可在幾秒內掃描 1 TB 的數據,在幾分鐘內掃描 1 PB 的數據。
在從GitHub中提取的277,975個Java源文件中,咱們過濾掉了Android、Arduino、重複和廢棄的repos。至此,咱們只剩下28,021個Java源文件。通過切片和分析,咱們獲得了最後的前100名。
Talk Is Cheap ,Show You The Code
首先,咱們建立一個倉庫表,用來存儲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類庫的列表了。
Java在過去的幾個月裏經歷了一些變化。它從6個月的發佈週期開始,最近咱們據說只有OpenJDK構建版本能夠自由訪問,而Java SE 8公開更新將須要生產使用的商業許可證。
Java的變化影響了開發人員,咱們能夠經過GitHub頂級Java庫流行程度的變化看出這一點。最近關於對Java SE更新收費的新聞可能會致使openjdk相關庫的使用增長,甚至可能會將數據轉移到企業相關庫。
最後,若是你想獲取整份榜單,請關注Hollis公衆號(ID:hollischuang),後臺回覆:榜單,便可得到完整版PDF。