A curated list of the essential Java libraries in Java and JVM software development
Java is the number one programming language in Business Application development. It is also one of the top programming languages.
One of the key features of Java is that it has a feature-rich and vast Core library. While the Standard Java library is powerful, you will need other Java libraries in professional Software Development. With 25 years of active development and adoption in the industry and community, Java has many mature and useful libraries.
Here I am listing the top 10 Java libraries used in Java Applications in all domains. Whether you develop software for a hobby project or enterprise-grade project, you probably need most of the libraries I have listed below.
Apache Commons is like a Swiss knife in Java software development and extends many of the Java Core libraries. If you ever feel like writing a utility class in your project, the chances are relatively high that there already exists a mature and powerful Apache Commons library. Apache Commons comprises 43 modular libraries covering domains like Collections, Math, Classes, Database, Caching, I/O Utils.
It is widely used in the industry and almost the unofficial Java Standard library enhancement. If you are working on a big project and not using any Apache Commons library, then you are probably re-inventing the wheel.
Java Collections Framework extension.
Mathematics and Statistics components.
Google Guava is another top-grade general-purpose Java library. Initially developed by Google and designed by renowned Software Engineer and Author Joshua Bloch. It is now an open-source project where many engineers outside Google contributed. Like Apache Commons, it is also Modular and contains many independent libraries.
It covers essential utilities, collections, string manipulation, concurrency utilities, graph libraries, I/O utils, hashing, and many more. Google Guava has a better software design compared to the Apache Commons library. If you find it necessary to create a shared library or utility class, then first have a look in Google Guava libraries.
Java Collections Framework extension.
In software development, you have to process variously formatted data. Either you have to load or save data in different formats, or you have to transfer data in various formats. JSON is the de-facto data exchange format in modern software development. Other common data formats are Avro, XML, YAML, Protobuf, CSV, BSON, CBR.
Jackson is a suite of data processing libraries for Java. Jackson JSON is the de facto streaming JSON parser/generator library. It also supports additional data formats such as Avro, BSON, CBOR, CSV, Smile, Protobuf, XML, or YAML and data types such as Guava, Joda, PCollections, and many more.
Jackson also offers data-binding and annotations. You can convert POJO to data or generate POJO from data with the help of Jackson annotations. If you work with data format, Jackson is a must-have toolset. It is highly modular with a Core module offering basic functionality and various extension modules.
Core modules for streaming, annotations, data-binding, and supports JSON data format.
Specific modules for Data type Avro, CBOR, CSV, Ion, Protobuf, Smile, XML, YAML, etc.
Kotlin native types.
Standard and collection datatypes.
Support third-party data types (Yandex Bolts, GeoJSON, Lombok, MongoDB, and many more).
As discussed in the previous section, XML is another prevalent data format that offers stricter validation, storage, and transportation of data. Until Java 8, the Java Standard library has XML support, including data binding. Since Java 9, the XML processing functionalities are no more part of the Standard Java library and moved to a separate library, JAXB.
JAXB offers everything you need to work with XML in Java. It provides a standard and efficient way of mapping between the XML and Java code. It additionally includes annotation-based data binding.
Support for all W3C XML Schema features.
Annotation-based Java-to-XML data binding.
Logging is an integrated and essential part of production-grade Software Development. Careful logging will help you understand the working of the software and find the root cause of an error, especially in the production system. Java Standard library offers basic Logging in java.util.Logging. There are also other logging libraries like Log4j, Log4j 2, Logback, which provide advanced logging in Java. While these logging libraries offer concrete implementation, SLF4J offers abstraction or facade for various logging libraries. It allows the users to change the desired logging library during deployment.
At first, it may sound counterproductive to use additional facade library SLF4J for logging. But using SLF4J will give you extra flexibility to change the concrete logging library effortlessly if necessary. It is always a good idea to use your preferred logging framework as a pluggable logger to the SLF4J.
Provides abstraction of the underlying logging framework.
The logging framework can be changed during runtime.
Supports all major logging framework.
Offers a library (slf4j-ext.jar) with helpful tools and features.
Event logger to record events.
There are many excellent logging libraries in Java: java.util.logging, Log4j, Log4j 2, Logback. Among them, Log4j 2 and Logback are the two most powerful logging library. I prefer Log4j 2 slightly better than Logback, especially for large projects as it gives better performance. For a large project, the performance of a logging library can be crucial, especially the asynchronous logging, peak throughput, latency. In terms of those criteria, Log4j 2 slightly edges out Logback as described here:
Improved performance via Asynchronous logging.
Separates API from implementation.
Unit/Integration testing is an integral part of the Software Development process. Often you want to test a single Class (SUT), but it depends on other heavyweight classes or external functionalities (e.g., Database operations, I/O operations). One way to write the Unit/Integration test in such scenarios is Mocking. You can mock the behavior of other external Service calls and only focus on the Class you want to test.
Mockito is the most widely used mocking library in Java. Whether you are testing a small project or a huge, complex Enterprise Java project, you can use Mockito everywhere. It offers a very simple, clean API and keeps your Unit/Integration tests clean.
Lean and clean API.
Provides a simplified stubbing model.
Partial mocking via spy.
Annotation-based mock/spy injection.
Behavior-driven development syntax using BDDMockito.
AssertJ is the second library related to TDD in my list. One of the main features of testing is to verify whether the test result matches the expected result. JUnit has a built-in assertion mechanism in class org.junit.Assert. It offers a couple of static methods for test verification. For a professional developer, those couple of methods are not enough.
Fortunately, there exists two mighty assertion library in the Java landscape: Hamcrest matchers and AssertJ assertions. I prefer AssertJ over Hamcrest because of its fluent API. It is also highly modular, offering the necessary functionalities in its Core module and some advanced functionalities in other modules.
Fluent assertion API for better code readability.
Rich set of assertions and helpful error messages.
Core module for Standard Java Library.
Modules to provide assertions in popular Java libraries, e.g., Guava, Joda, Neo4j.
Module to provide assertions for SQL databases.
In our daily life as a Software Engineer, we have to work with the Data Store. In modern days, there are many types of Data Store: SQL and a myriad of NoSQL data stores. One way to deal with the Data Store is to use the low-level API (e.g., JDBC for SQL). The downside of this approach is that it is not portable.
So, the best way to deal with Data Store is to introduce an abstraction layer between your application and the Data Store. This abstraction layer (ORM) maps Java Class with Database Table/Collection. Hibernate is one of the earliest ORM libraries among all programming languages and has inspired many similar technologies in the industry.
Although Hibernate is mainly known for the ORM functionalities for the SQL databases, it has expanded into NoSQL databases as well. Hibernate is also modular and offers a core module and many functionalities based modules.
Domain model persistence for relational databases (ORM).
Domain model persistence for NoSQL data stores (OGM).
Annotation-based validations for the domain model.
Full-text search for domain models.
HTTP is by far the most used and prevalent Application-Layer protocol. Java Standard library does not offer much to handle with the HTTP. Fortunately for us, Apache HTTPComponents provides a toolset of Java components focused on HTTP and associated protocols. Apache HTTPComponents is also extremely modular, offering a Core module to develop custom Client/Server HTTP services with a low footprint. It also provides value-added modules for advanced functionalities like Asynchronous HTTP Client.
Low-level HTTP Transport Components for Client/Server services.
Offers both blocking and non-blocking I/O models.
Synchronous HTTP Client for client-side authentication, state management, and connection management.
Asynchronous HTTP Client to handle a high number of concurrent connections.