1. 程式人生 > >2018年排名Top 100的Java類庫——在分析了277,975份原始碼之後得出的結論

2018年排名Top 100的Java類庫——在分析了277,975份原始碼之後得出的結論

最近,OveOps公佈了The Top 100 Java Libraries in 2018 - Based on 277,975 Source Files,Hollis查看了這份榜單,做了翻譯和補充,向你展示2018年的風雲Java類庫,希望可以給正在使用Java的你一些幫助和啟示。不能說榜單中的類庫都是最好的,但是至少是目前比較受歡迎的。

時間如流水,轉眼間2018年已經要接近尾聲了,過去的一年,可以說是瘋狂的一年。SpaceX成功發射了重型獵鷹火箭,蘋果成為首個突破一萬億美元市值的上市公司。

2018年,在IT圈也發生了許多大事和喜事,SpringBoot 2釋出、Java釋出了10 和 11兩個版本、GitHub下嫁MicroSoft、IBM迎娶RedHat等,和往年一樣,我們分析了2018年排名Top 100的Java類庫。

最受歡迎的前20個Java類庫

今年,Top 100 Java類庫的排名發生了一個戲劇性的改變,榜首換人了,在此之前,JUnit已經蟬聯了三屆冠軍。而今年,冠軍寶座被fasterXML/Jackson 佔據。 而這個類庫,2016年排名第14名、2017年排名第18名。

Jackson是一個JSON庫,可以方便的將JSON轉化成Java的物件模型,以及把Java的物件模型轉換成一串JSON。在往年的榜單中,Jackson就是所有JSON類庫中排名最靠前的。

Jackson所依賴的jar包較少,簡單易用並且效能也要相對高些,並且Jackson社群相對比較活躍,更新速度也比較快。具有以下特點:

  • 容易使用 - jackson API提供了一個高層次外觀,以簡化常用的用例。
  • 無需建立對映 - API提供了預設的對映大部分物件序列化。
  • 效能高 - 快速,低記憶體佔用,適合大型物件圖表或系統。
  • 乾淨的JSON - jackson建立一個乾淨和緊湊的JSON結果,這是讓人很容易閱讀。
  • 不依賴 - 庫不需要任何其他的庫,除了JDK。
  • 開原始碼 - jackson是開源的,可以免費使用。

去年包攬前三甲的JUnit家族三大成員JUnitJUnit Runnerjunit.framework今年分別位列第三、第四和第五名。

今年排名第二名的是Apache Hadoop,是一款支援資料密集型分散式應用程式並以Apache 2.0許可協議釋出的開源軟體框架。它支援在商品硬體構建的大型叢集上執行的應用程式。Hadoop的框架最核心的設計就是:HDFS和MapReduce。HDFS為海量的資料提供了儲存,而MapReduce則為海量的資料提供了計算。

在我們排名前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.langorg.apache.ibatisorg.apache.mavenorg.apache.http.clientapache.commons.lang3等也都在前20的榜單中。

被擠出前20的Java類庫

為了分析榜單的變化情況,我們對比了2017年top20的類庫和今年的類庫榜單。我們發現,除了JUnit的使用減少以外,還有些類庫排名在下降,有些甚至從前二十名被擠出。

首當其衝的是去年位列第四和第五名的Mockitoslf4j,今年被無情的甩出了前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。