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" MyProgram.java 
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.**