优秀且经验丰富的 Java 开发人员的特征之一是对 API 的广泛了解,包括 JDK 和第三方库。
通常是会为日常工作提供有用的库,例如 Log4j 等日志库、Jackson 等 JSON 解析库以及 JUnit 和 Mockito 等单元测试 API。如果您需要在项目中使用它们,则可以在项目的类路径中包含这些库的 JAR 以开始使用它们,也可以使用 Maven 进行依赖项管理。
当您使用 Maven 进行依赖项管理时,它会自动下载这些库,包括它们所依赖的库,称为传递依赖项。例如,如果您下载 Spring Framework,那么它还将下载 Spring 所依赖的所有其他 JAR,例如 Log4j 等。
您可能没有意识到,拥有正确版本的依赖 JAR 是一个非常令人头疼的问题。如果您有错误的 JAR 版本,那么您将获得
ClassNotFoundExceptionorNoClassDefFoundError,或 UnsupportedClassVersionError。
单元测试是将普通开发人员与优秀开发人员区分开来的最重要的事情。程序员经常被找借口不编写单元测试,但避免单元测试的最常见借口是缺乏对 JUnit、Mockito 和 PowerMock 等流行单元测试库的经验和知识。
在当今的 Web 服务和物联网 (IoT) 世界中,JSON 已成为将信息从客户端传输到服务器的首选协议。它们已经取代了 XML,成为以独立于平台的方式传输信息的首选方式。
不幸的是,JDK 还没有 JSON 库,但幸运的是,有许多好的第三方库可以让你解析和创建 JSON 消息,比如 Jackson 和 Gson。
日志记录库很常见,因为每个项目都需要它们。对于服务器端应用程序来说,它们是最重要的,因为日志只放在您可以查看应用程序中正在发生的事情的地方。
尽管 JDK 自带日志库,但仍有许多更好的替代方案可用,例如 Log4j、SLF4j 和 LogBack。
Java 开发人员应该熟悉记录库的利弊,并且知道为什么使用 SLF4j 比普通的 Log4j 更好。
有几个非常好的通用第三方库可供 Java 开发人员使用,例如 Apache Commons 和 Google Guava。
正如 Joshua Bloch 在 Effective Java(现在第 3 版也可用)中正确地指出的那样,重新发明轮子是没有意义的,我们应该更喜欢使用久经考验的库,而不是时不时地编写我们自己的例程。
对于一个好的 Java 开发人员来说,熟悉 Google 的 Guava 和 Apache commons 库是有意义的。
我不太喜欢JDK的一件事是它缺乏对HTTP的支持。尽管您可以使用 java.net 包中的类建立 HTTP 连接,但它并不像使用 Apache HttpClient 和 HttpCore 等开源第三方库那样简单和无缝。
尽管 JDK 9 带来了对 HTTP 2.0 的支持和对 HTTP 的更好支持,但我强烈建议所有 Java 开发人员熟悉流行的 HTTP 客户端库,如 HttpClient 和 HttpCore。
您还可以查看 Java 9 中的新增功能 - 模块等,以了解有关 JDK 9 的 HTTP 2 支持的更多信息。
有许多 XML 解析库存在,例如 Xerces、JAXB、JAXP、Dom4j、Xstream 等。Xerces2 是 Apache Xerces 系列中的下一代高性能、完全兼容的 XML 解析器。这个新版本的 Xerces 引入了 Xerces 原生接口 (XNI),这是一个用于构建解析器组件和配置的完整框架,它非常模块化且易于编程。
Apache Xerces2 解析器是 XNI 的参考实现,但其他解析器组件、配置和解析器可以使用 Xerces 本机接口编写。Dom4j 是另一个用于 Java 应用程序的灵活 XML 框架。
信不信由你,但所有实际应用程序都必须以某种形式与 Microsoft Office 进行交互。许多应用程序需要提供在 Excel 中导出数据的功能,如果您必须从 Java 应用程序执行相同的操作,则需要 Apache POI API。
这是一个非常丰富的库,允许您从 Java 程序读取和写入 XLS 文件。您可以查看该链接,了解在 Core Java 应用程序中读取 Excel 文件的工作示例。
如果你正在编写一个框架或库来生成代码或与字节码交互,那么你需要一个字节码库。它们允许您读取和修改应用程序生成的字节码。Java 世界中一些流行的字节码库是 javassist 和 Cglib Nodep。
Javassist(JAVA编程ASSISTant)使Java字节码操作变得非常简单。它是一个用于在 Java 中编辑字节码的类库。ASM 是另一个有用的字节码编辑库。
如果您从 Java 应用程序与数据库交互,但未使用数据库连接池库,则您错过了某些内容。由于在运行时创建连接需要时间,并且会降低请求处理速度,因此始终建议使用数据库连接库。一些流行的是 Commons Pool 和 DBCP。
在 Web 应用程序中,它通常是一个提供这些功能的 Web 服务器,但在核心 Java 应用程序中,您需要将这些连接池库包含在类路径中才能使用数据库连接池。
与日志记录和数据库连接类似,消息传递也是许多实际 Java 应用程序的通用功能。Java 提供了 JMS、Java 消息传递服务,但这不是 JDK 的一部分,您需要包含单独的 jms.jar。同样,如果您使用的是像 Tibco RV 这样的第三方消息传递协议,那么您需要在应用程序类路径中使用第三方 JAR,例如 tibrv.jar。
与 Microsoft Excel 和 Word 类似,PDF 是另一种无处不在的格式。如果您需要在应用程序中支持 PDF 功能,例如将数据导出为 PDF 文件,则可以使用 iText 和 Apache FOP 库。两者都提供了有用的 PDF 相关功能,但 iText 更丰富、更好.
在 Java 8 之前,JDK 的数据和时间库存在许多缺陷,例如它们不是线程安全的、不可变的和容易出错的,许多 Java 开发人员依靠 JodaTime 来实现他们的日期和时间要求。
从 JDK 8 开始,没有理由使用 Joda,因为您可以在 JDK 8 的新日期和时间 API 本身中获得所有这些功能,但如果您使用的是较旧的 Java 版本,那么 JodaTime 是一个值得学习的库。
尽管 JDK 拥有丰富的集合库,但也有一些第三方库提供了更多选项,例如 Apache Commons Collections、Goldman Sachs Collections、Google Collections、Eclipse Collections 和 Trove。Trove 库特别有用,因为它为 Java 提供了高速的常规和原始集合。
FastUtil 是另一个类似的 API,它通过提供特定于类型的映射、集、列表和优先级队列来扩展 Java 集合框架,这些映射、集、列表和优先级队列具有较小的内存占用和快速访问和插入;还提供大型(64 位)数组、集合和列表,以及用于二进制和文本文件的快速、实用的 I/O 类。
javax.mail和 Apache Commons Email - 提供用于发送电子邮件的 API。它建立在 JavaMail API 之上,旨在简化 API。
与 JSONandXML 类似,HMTL 是我们许多人必须处理的另一种常见格式。值得庆幸的是,我们有 jsoup,它大大简化了在 Java 应用程序中使用 HTML 的过程。您不仅可以使用 JSoup 解析 HTML,还可以创建 HTML 文档
它提供了一个非常方便的 API,用于提取和操作数据,使用最好的 DOM、CSS 和类似 jquery 的方法。jsoup 实现了 WHATWG HTML5 规范,并将 HTML解析为与现代浏览器相同的 DOM。
Apache Commons 编解码器包包含各种格式的简单编码器和解码器,例如 Base64 和 十六进制。除了这些广泛使用的编码器和解码器之外,编解码器包还维护了一系列语音编码实用程序。
我真的很喜欢像 H2 这样的内存数据库,你可以把它嵌入到你的 Java 应用程序中。它们非常适合测试 SQL 脚本和运行需要数据库的单元测试。顺便说一句,H2 不是唯一的数据库,您还有 Apache Derby 和 HSQL 可供选择。
有一些很好的JDBC扩展库,可以使调试更容易,如P6spy。它是一个库,可以无缝拦截和记录数据库数据,而无需更改应用程序的代码。您可以使用它们来记录 SQL 查询及其计时。
例如,如果在代码中使用 PreparedStatmentandCallableStatement,则这些库可以记录带有参数的确切调用以及执行所花费的时间。
Google Protocol Buffer 或 protobufis 是一种以高效且可扩展的格式对结构化数据进行编码的方法。它是 Java 序列化的更丰富、更好的替代方案,我强烈建议有经验的 Java 开发人员学习 Google Protobuf。
一些有用的网络库是 Netty 和 Apache MINA。如果要编写需要执行低级别网络任务的应用程序,请考虑使用这些库。
例如,只需定义属性即可创建数据类,Lombok 可以生成构造函数、getter、setter、equals、hashcode、toString 以及介于两者之间的所有内容。在 Intellij IDEA 和 Eclipseis 中使用 Lombok 也很有趣,因为它们都为 Lombok 提供了出色的支持,并且有一个专用的插件。
与 testcontainers 一样,它允许您很好地设置您的测试及其所有依赖项,
这就是每个 Java 开发人员都应该熟悉的一些有用的库。Java 生态系统非常庞大,您会发现大量用于执行不同操作的库。你思考一些事情,你会发现有一个库可以做到这一点。与往常一样,Google 是您寻找有用 Java 库的最佳朋友,但您也可以查看 Maven 中央存储库,为您手头的任务找到一些有用的库。