Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:


1. Introduction

Java is a widely used programming language that offers various mechanisms for managing dependencies and organizing code.

In the same context, modulepath and classpath are two fundamental concepts for managing dependencies in Java. Moreover, understanding the difference between these two is crucial for efficient Java development.

In this tutorial, we’ll explore the distinctions between the modulepath and classpath and their significance in Java applications.

2. Dependencies in Java

Dependencies refer to external libraries, modules, or packages required for a Java program to compile and run successfully. These dependencies often provide additional functionalities or resources unavailable in the core libraries. Managing dependencies effectively ensures that the required resources are available at runtime.

3. Classpath in Java

Classpath is an environment variable that tells the Java Virtual Machine (JVM) where to find classes and resources during runtime.

It consists of a collection of directories, JAR, and ZIP files that contain compiled Java bytecode (.class files) and associated resources such as configuration files, property files, and other assets.

When a Java program is executed, the JVM uses the classpath to locate the required classes and resources. Additionally, it allows the JVM to load classes from different locations, including the Java standard library, external libraries, and project-specific code.

Here’s an example of using the classpath:

javac -cp "lib/mylibrary.jar" 
java -cp "lib/mylibrary.jar:." MyProgram

In the above code, the -cp option specifies the classpath. We include the lib/mylibrary.jar file in the classpath using the -cp option and the current directory (.) where the program’s class files reside.

4. Modulepath in Java

It is a collection of directories, JAR files, and modules that contain compiled module files (.mod files) and their associated dependencies.

In addition, when a modular Java program is executed, the JVM uses the modulepath to resolve modules and their dependencies.

Here’s an example of using the modulepath:

javac --module-source-path project -d mods --module moduleA --module moduleB 
java --module-path mods --module moduleB/com.example.ModuleB

In the above code, the –module-source-path option specifies the root directory of the modules, and the -d option indicates the output directory for compiled module files (mods directory in this case).

The –module-path option specifies the modulepath, which includes the mods directory containing the compiled module files. We then specify the main module (moduleB) and the main class (com.example.ModuleB) to run.

5. Differences Between Modulepath and Classpath

To effectively manage dependencies, achieve modularity, and optimize performance in all Java applications, it’s essential to understand the differences between the modulepath and classpath clearly.

Hence, the following table summarizes the key differences between them:

Classpath Modulepath
Handles dependencies at a granular level using class files and JAR files Enforces explicit dependency declarations at the module level
Doesn’t enforce explicit dependency declarations, leading to potential issues Ensures a clear understanding of required resources, avoiding conflicts
All classes and resources are globally accessible by default Promotes encapsulation and controlled visibility
Unrestricted accessibility can lead to naming conflicts or unintended dependencies Prevents unwanted dependencies. Since the only exported packages are accessible by other modules
Less efficient since it requires searching through directories and JAR files More efficient by building a dependency graph and loading only required modules, improving performance
The search process can be time-consuming, especially for large classpaths Reduces search overhead, enhancing runtime performance

6. Conclusion

In this article, we discussed the distinction between the modulepath and classpath, crucial for effective dependency management, modularity, and performance optimization in Java applications. 

Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

res – REST with Spring (eBook) (everywhere)
Inline Feedbacks
View all comments
Comments are open for 30 days after publishing a post. For any issues past this date, use the Contact form on the site.