25年前,James Gosling创建了Java,并永远地改变了编程语言的版图。与许多其他编程语言不同,Java在整个生命周期中都受到业界的高度欢迎和需求。
Java具有非常优秀的Core库,提供了许多基本功能。 基于其高度流行性,因此也存在许多成熟而强大的Java库。 作为务实的软件开发人员,在业务开发过程中, 为了解决常见或重复出现的问题,应该尽量使用成熟的库,而不是重新发明轮子。
在这篇文章中,我想介绍另外25个Java库来庆祝Java的25周年纪念。这些库基本都是成熟而且久经考验的,可以为Java软件开发中可能遇到的常见问题提供可靠的解决方案。
RxJava
Reactive Extensions(ReactiveX)是一种流行的软件开发范例,用于处理异步和事件驱动的编程。 RxJava是使用Observables的Reactive Extensions的Java VM实现。RxJava以声明方式在事件/数据序列上添加可组合运算符,从而扩展了观察者模式以支持事件驱动的编程。 此外,它还隐藏了诸如多线程、线程安全,同步和并发数据结构之类的底层复杂性。
如果你想在Java中进行响应式编程,那么这是一个必不可少的库。
Link:
ReactiveX/RxJavaRxJava
OkHttp
到目前为止,HTTP是最常用的应用层协议。因此有许多优秀的基于java的HTTP客户端库,而OkHttp算得上是其中最简单但功能强大的一个HTTP库。它提供了流畅,干净的API,可用于在Java中开发HTTP客户端。
它还支持一些高级特性:连接池、GZIP压缩、响应缓存、现代TLS特性等等。
Link:
square/okhttpSee
MyBatis
在多数软件系统中,都需要对数据进行存储。而在众多数据存储方案中,SQL仍是最常用的存储类型。作为Java开发人员,需要将Java对象与SQL表匹配。有一种实现此映射的方法是使用ORM(如Hibernate),但是在很多场景中——比如性能场景,开发人员希望完全控制对象-表映射。在这种情况下,你可以直接使用JDBC并编写SQL查询。另一种方式就是MyBatis将Java对象映射到存储过程或SQL语句,其中提供了基于注释的映射和基于XML描述符的映射。
相比原生的JDBC,大部分开发人员更喜欢MyBatis,尤其是在大规模项目中,因为它可以分离关注点,开发人员可以投入更多精力进行业务逻辑的开发。
Link:
mybatis/mybatis-3
HikariCP
HikariCP也是与数据库相关的库。建立JDBC连接是非常消耗资源的操作,如果每次访问数据库时都创建一个新连接,使用结束之后将其关闭,这会严重影响应用程序的性能;更不用说未正确关闭的或者不限制数量的数据库连接都可能会使你的应用崩溃。
使用连接池意味着每次请求连接时将重用连接,而不是创建新连接。HikariCP是JVM中一个非常快但轻量级的数据库连接池,它也是一个非常可靠的“零开销” JDBC连接池。
Link:
brettwooldridge/HikariCP
Lombok
Java经常被批评为是冗长和臃肿的编程语言。与其他流行编程语言(JavaScript、Python、Scala、Kotlin等)相比,开发人员使用Java开发时,需要编写大量的样板代码。尽管Java在JDK 15中引入了Records来减少Java中的样板代码,但JDK 15不是LTS版本。 幸运的是,有一个库可以大大减少Java中的样板代码: Lombok。通过使用Lombok库,你可以通过添加一些注释来生成getter、setter、hashcode、equals、toString、Builder类。此外,它还提供了空指针检查、日志记录等更多功能。
Link:
rzwitserloot/lombok
VAVR
在JDK 8中,Java终于Lambda和Streaming发布了人们期待已久的函数式编程。如果你之前已经习惯了函数式编程,或者希望深入研究函数式编程,你可能会发现Java中的函数式编程功能很匮乏。与其它的函数式编程语言(Haskell、Scala)相比,Java的函数式编程功能显得很苍白。VAVR库则可以填补Java中函数式编程特性的空白,其中提供了持久的集合、用于错误处理的函数式抽象、并发编程、模式匹配等。
Link:
Vavr
Gson
多年来,JSON已成为事实上的数据交换格式。 在Java中,也有一些处理JSON的优秀库,包括非常有名的Jackson和FastJson。还有一个出色的库就是Google的Gson, 与Jackson不同,这是一个很简约的库,仅支持JSON。 它提供数据绑定、广泛的通用支持、灵活的自定义。 Gson的主要优点(或者说缺点,取决于你自己的喜好)之一是不需要注解。
Link:
google/gson
jsoup
如果你在使用Java开发应用程序并且需要处理HTML,那你可以使用jsoup。这是一个用于处理实际HTML的Java库。 它为获取URL以及提取和处理数据提供了非常方便的API。 它实现了WHATWG HTML5规范,并使用最佳的HTML5 DOM方法解析HTML。 它支持从URL 或字符串解析HTML、查找和提取数据、操纵HTML元素、清理HTML、输出HTML等。
Link:
jhy/jsoupjsoup
JIB
如果你在开发企业级应用程序,那么它至少应该支持云部署。服务上云准备工作的第一步就是,将应用程序容器化,也就是将你的artifactory二进制文件放入Docker镜像中。对Java程序进行容器化的工作有点繁琐:你需要对Docker有深入的了解,需要创建Dockerfile,还需要Docker Daemon。幸运的是,对于Java开发人员而言,Google使用现有工具创建了一个开源的Java容器化程序。 您可以将JIB用作Java库来构建优化的Docker和OCI镜像。
Link:
GoogleContainerTools/jib
Tink
Tink是出自Google的另一个方便的Java库。密码学和安全性在软件开发中变得越来越重要。加密技术用于保护用户数据。正确实施加密需要大量的专业知识和精力。 Google的一组密码学家和安全工程师编写了多语言密码库Tink。 它提供了易于使用但不易误用的安全API。Tink通过不同的原语提供加密功能。 它提供对称密钥加密,流对称密钥加密,确定性对称密钥加密,数字签名,混合加密以及许多其他加密功能。
Link:
google/tink
Webmagic
如果您从事Web信息提取,您可以编写自己的爬虫程序,这既费时又乏味。在Java中,Webmagic是一个优秀的Web爬虫库,涵盖了爬虫的整个生命周期:下载、URL管理、内容提取和持久性。它提供了一个简单而灵活的核心、注释支持、多线程和易于使用的API。
Link:
code4craft/webmagic
ANTLR 4
如果您的工作是解析和处理数据,那么ANTLR库会非常方便。它是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。它通过使我们能够访问语言处理原语(例如词法分析器、语法、解析器和运行时)来对其进行处理,从而实现对数据的处理。
它通常用于构建工具和框架。
Link:
antlr/antlr4
Caffeine
如果您的应用程序中存在大量读操作,则缓存可以大大提高您的应用程序的数据访问性能。 Java有许多很棒的缓存库,Caffeine是其中最好的。 它是一个基于Java的高性能、近乎最佳的缓存库。它提供了一个流畅的缓存API和一些高级特性,如异步加载项、异步刷新、弱引用键等。
Link:
ben-manes/caffeine
Metrics
Java应用程序投入生产后,您将需要深入了解应用程序的关键组件。 Dropwizard框架中的Metrics是一个简单而引人注目的Java库,可提供对您的应用程序和JVM KPI的监控,例如,事件发生率、挂起的作业、服务运行状况检查等。 它是模块化的,并为其它库/框架提供监控模块。
Link:
dropwizard/metrics
gRPC-Java
谷歌在2015年创建了gRPC作为一个现代远程过程调用系统。此后,gRPC变得非常流行,并且是现代软件开发中使用最广泛的RPC系统之一。 gRPC-Java库是gRPC客户端的Java实现。 如果要在Java中使用gRPC,则该库会为您带来很多方便。
Link:
grpc/grpc-java
Java WebSocket
传统的客户端-服务器通信是单向的。WebSocket是通过单个TCP连接的双向通信协议。 Java WebSocket是Java完成的准系统级的WebSocket服务器和客户端实现。 如果您是Java开发人员,并且想使用WebSocket,那么强烈推荐您使用此库。
Link:
TooTallNate/Java-WebSocket
JJWT
JSON Web令牌(JWT)是现代软件开发中事实上的授权和安全信息交换格式。无论您使用的是简单的基于会话的授权还是高级的基于OAuth2的授权,都可能使用JWT。JJWT是一个简单的Java库,用于在Java和JVM环境中创建和验证JWT。其中所有已实现功能都完全符合对应的RFC规范,而且提供了可读性强且方便的流利API。
Link:
jwtk/jjwtJJWT
Swagger-Core
OpenAPI是机器可读接口文件的规范,用于描述、产生、使用和可视化RESTful Web服务。 Swagger-Core是OpenAPI规范的Java实现。 如果要在Java或JavaEE应用程序中公开发布REST API,则可以使用Swagger-Core自动提供并公开API定义。
Link:
swagger-api/swagger-core
Async Http Client
由于异步编程的非阻塞特性,它最近变得越来越流行。大多数流行的Java HTTP客户端库都受限于未提供对异步HTTP响应的处理。Async Http Client是一个流行的Java库,提供异步HTTP响应处理,此外,该库还支持WebSocket协议。
Link:
AsyncHttpClient/async-http-client
Liquibase
作为软件开发人员,我们都知道代码的版本控制、DevOps和CI/CD的重要性。在博客文章:Evolutionary Database Design中,Martin Fowler指出,我们需要对代码进行版本控制和CI/CD。Liquibase是一个工具,它支持对Java应用程序中的SQL数据库更改进行跟踪、版本控制和部署。如果你使用的是SQL数据库,并且数据结构正在不断调整,那么这个工具可以极大地简化数据库迁移过程。
Link:
Liquibase | Open Source Version Control for Your Database
Springfox
我已经在前面列出了Swagger-Core,它可以自动为原始Java或Java EE应用程序生成REST API文档。 在企业应用程序开发中,Spring MVC已超过Java EE,成为排名第一的应用程序开发平台。 在基于Spring的Java应用程序中,Springfox库可以从源代码自动生成REST API文档。
Link:
springfox/springfox
JavaCV
OpenCV是一个计算机视觉和机器学习软件库。它是开源的,旨在为计算机视觉应用程序提供一个通用的基础设施。JavaCV是对计算机视觉领域中OpenCV和许多其他流行库(FFmpeg、libdc 1394、PGR FlyCapture)的一个封装。JavaCV还具有硬件加速的全屏图像显示,用于在多核上并行执行代码的简便方法,用户友好的相机和投影仪的几何和颜色校准,特征点的检测和匹配以及许多其他功能特征。
Link:
bytedeco/javacv
Joda Time
在java8之前的核心库中,Java的日期和时间功能很糟糕。Java8在其java.time包中发布了急需的高级日期和时间功能。 如果您正在使用Java的旧版本(Java8之前的版本),则Joda time可以为您提供高级的日期和时间功能。 但是,如果您使用的是Java的较新版本,那就不需要此库。
Link:
JodaOrg/joda-time
Wiremock
HTTP是现代应用程序开发中最受欢迎的传输协议,而REST是基于微服务的应用程序开发中事实上的通信协议。在编写单元测试期间,最好专注于SUT(被测系统)并模拟SUT中使用的服务。Wiremock是REST API的模拟器,使开发人员可以针对不存在或不完整的API编写代码。 在基于微服务的软件开发中,Wiremock可以大大提高开发速度。
Link:
tomakehurst/wiremock
MapStruct
在Java应用程序开发中,通常需要将一种类型的POJO转换为另一种类型的POJO。 实现此POJO或Bean转换的一种方法是显式地编写转换逻辑,这会导致代码很繁琐。 还有一个明智的方法是使用专门开发的库来转换POJO / Bean。 MapStruct是一个代码生成器,它根据配置方法上的约定在POJO / Bean之间实现映射。 生成的映射代码直接使用简单的方法调用,因此是快速、类型安全且易于理解的。
Link:
mapstruct/mapstruct
总结
当然,对于像Java这样大型的软件生态系统,这个列表是根本无法完全涵盖的。有许多优秀的Java库我没有在这里列出,也都值得一试。但是,这个列表可以帮助您快速了解Java生态系统。
参考:
https://towardsdatascience.com/25-lesser-known-java-libraries-you-should-try-ff8abd354a94