2018年排名Top 100的Java类库——在分析了277,975份源码之后得出的结论

news/2025/2/6 2:59:37/

最近,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类库。

2017年排名Top 100的Java类库——在分析了259,885份源码之后得出的结论 2016年排名Top 100的Java类库——在分析了47,251个依赖之后得出的结论

最受欢迎的前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

SELECTfull_name
FROMjava_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'))));

现在,我们有了排名靠前的类库的名字,然后我们把他们都拉取下来:

SELECTrepo_name,content
FROM[bigquery-public-data:github_repos.contents] AS contents
INNER JOIN
(SELECTid,repo_nameFROM[bigquery-public-data:github_repos.files] AS filesINNER JOINjava_top_repos_filtered AS top_reposONfiles.repo_name = top_repos.full_nameWHEREpath LIKE '%.java'
) AS files_filtered
ONcontents.id = files_filtered.id;

至此,我们有了每个项目的源代码,我们就要把去重后的import的语句过滤出来,然后在提取包名称。

SELECTpackage,COUNT(*) count
FROM
( //extract package name (exclude last point of data) and group with repo name (to count each package once per repo)SELECTREGEXP_EXTRACT(import_line, r' ([a-z0-9\._]*)\.') package,repo_nameFROM( //extract only 'import' code lines from *.java filesSELECTSPLIT(content, '\n') import_line,repo_nameFROMjava_relevant_dataHAVINGLEFT(import_line, 6) = 'import')GROUP BYpackage,repo_name
)
GROUP BYpackage
ORDER BYcount DESC;

最后,我们再进行一次过滤,确保没有Android, Arduino、过时的或者Java提供的原生的类库。

SELECT*
FROMjava_top_package_count
WHERENOT ((LEFT(package, 5) = 'java.') OR(LOWER(package) CONTAINS 'android'))
ORDER BYcount DESC;

至此,你就得到了一份2017年排名Top 100的Java类库的列表了。

最后的一点想法

Java在过去的几个月里经历了一些变化。它从6个月的发布周期开始,最近我们听说只有OpenJDK构建版本可以自由访问,而Java SE 8公开更新将需要生产使用的商业许可证。

Java的变化影响了开发人员,我们可以通过GitHub顶级Java库流行程度的变化看出这一点。最近关于对Java SE更新收费的新闻可能会导致openjdk相关库的使用增加,甚至可能会将数据转移到企业相关库。

最后,如果你想获取整份榜单,请关注Hollis公众号(ID:hollischuang),后台回复:榜单,即可获得完整版PDF。


http://www.ppmy.cn/news/535926.html

相关文章

【简单题string】A. Aramic script(Codeforces Problem-975A)

A. Aramic script codeforces题目链接Problem-975A 题意: 输入n个字符串,对每个字符串去重后,就是一个根对象,输出有多少根对象。比如样例一,a,aa,aaa,ab,abb,去重后的是字符串是a,a,a,ab,ab。所以只有a,a…

SWUST OJ#973 #975 #976 #977 统计二叉树节点个数

目录 #975 统计利用先序遍历创建的二叉树的度为2的结点个数 题目 思路 代码 #976 统计利用先序遍历创建的二叉树的度为1的结点个数 题目 思路 代码 #973 统计利用先序遍历创建的二叉树叶结点(0度)的个数 题目 思路 代码 #977 统计利用先序遍历创建的二叉树中的空链…

swust oj 973,975,976,977统计利用先序遍历创建的二叉树叶结点,度为2结点,度为1,空链域结点的个数,

统计利用先序遍历创建的二叉树叶结点,度为2结点,度为1,空链域结点的个数 思路: 1.叶节点即是左孩子和右孩子都空的节点 注:叶节点个数sum必须要用全局变量 题目描述 利用先序递归遍历算法创建二叉树并计算该二叉树叶结…

codeforce975D:Ghosts(思维)

题目链接:点击打开链接 题目大意: 这个题目的题面真的坑,个人感觉其实不是很难,但是我当时做完3题之后完全看不懂D题的题意,又感觉是个计算几何就直接扔那没管了。唉,其实知道题意之后蛮简单的&#xff0c…

Codeforces-975C - Valhalla Siege - 思维

题解链接: https://www.lucien.ink/archives/204/ 题目链接: http://codeforces.com/contest/975/problem/C 题目: Ivar the Boneless is a great leader. He is trying to capture Kattegat from Lagertha. The war has begun and wave a…

CF 975D Ghost 数学(基础)

题意:yaxb的直线上有n个点,给出这n个点的(x[i],vx[i],vy[i]),(vx[i],vy[i]为第i个点x,y的速度) 当两个点碰撞时,总价值2.n<2e5,-1e9<x[i]<1e9.问总价值为多少? 若(x1,vx1,vy1),(x2,vx2,vy2)能在t秒相遇 x1t*vx[1] x2t*vx[2] y1t*vy[1] y2t*vy[2] 则 (x2-x1)/(vx[…

简历不要随意给猎头!他们会胡乱投递,影响你之后求职!

猎头是求职的重要途径之一&#xff0c;但猎头群体良莠不齐&#xff0c;并不是每个猎头都值得信任。 一位网友就对猎头持怀疑态度&#xff0c;问大家&#xff1a; 简历可以随意给猎头吗&#xff1f;给他们的时候需要注意什么&#xff1f;他们会不会群发&#xff0c;对自己之后求…

柯尼卡美能达

一、技术维修代表模式功能设置步骤! 步骤&#xff1a; 按效用/计数器键&#xff1b; 触摸&#xff3b;Check Detail&#xff3d;&#xff1b; 依照此顺序按以下各个键。停止→ 0 → 0 → 停止 → 0 → 1&#xff1b; 输入8 位数字的维修密码&#xff0c;然后触摸&#xff3…