Module dependency refers to one module being dependent on or requiring another module. Module dependencies were introduced in the Declaring Dependency on Other Modules section in the article "Developing a Module with Java 9 in Eclipse IDE, Part 1." In the first of two articles, "Using Module Dependencies, Part 1," we created two Java projects for two modules, a main module and a dependency module. We couldn't have created both modules in one Java project because the Eclipse IDE does not support multiple modules in a single project. Having created two projects, in this continuation article we shall export each project to a separate JAR file. Exporting and using a module as a JAR file is discussed in an earlier tutorial, "Using a Java 9 Module as a JAR File." Adding multiple modules in a single JAR is not currently supported, but is planned for a future Java version. In this article, we shall discuss configuring the two Java projects and running the main module application to demonstrate module dependency. This article has the following sections:
- Setting the Build Path of the Main Java Project
- Exporting the Main Java Project to a JAR File
- Exporting the Dependency Java Project to a JAR File
- Adding a Run Configuration
- Running the Main Module Java Application
The two Java projects previously developed have errors, as indicated by the red markers in Figure 1. The errors are indicated because the two modules are defined in separate projects and the dependency project is not in the build path of the main project.
Figure 1: Java Projects with Errors
In this section, we shall configure the build path for the MainModule project to add the HelloJavaModule project to the build path. Right-click MainModule in Package Explorer and select Build Path>Configure Build Path, as shown in Figure 2.
Figure 2: Package Explorer>Build Path>Configure Build Path
In the Properties window, the Java Build Path default settings are displayed, as shown in Figure 3.
Figure 3: Java Build Path
Select the Projects tab and select Modulepath, as shown in Figure 4. Click Add…
Figure 4: Java Build Path>Projects>Modulepath>Add…
The Required Project Selection window displays the dependency project HelloJavaModule, as shown in Figure 5. Select the HelloJavaModule project and click OK.
Figure 5: Selecting a Project to Add
The HelloJavaModule project gets added to the Modulepath (see Figure 6). Click Apply and Close.
Figure 6: Java project HelloJavaModule added to Modulepath
The errors and red markers get removed from the MainModule project, as shown in Figure 7.
Figure 7: Errors removed from MainModule
Adding the HelloJavaModule project to the build path of the MainModule project only removes the build/compile time errors. For runtime, we would need to export each of the modules to a JAR file and add the JAR files to the runtime module path for when the project is run. The JAR files would need to be exported to the same folder so that we are able to configure the module path without referring to modules across projects. As mentioned before, a multi-module JAR is not yet supported but is planned to be supported in a later version of Java.
To export the MainModule project to a JAR file, right-click MainModule in Package Explorer and select Export, as shown in Figure 8.
Figure 8: Package Explorer>MainModule>Export
In the Export window, select Java>JAR file, as shown in Figure 9, and click Next.
Figure 9: Export>Java>JAR file>Next
In JAR File Specification, select the resource to export as the MainModule, as shown in Figure 10. Select the export destination as the MainModule\modules\mainmodule.jar. Click Next.
Figure 10: JAR File Specification
Select the default JAR Packaging Options (see Figure 11) and click Next.
Figure 11: Selecting Packaging Options
Next, customize the JAR Manifest Specification, which includes selecting the class of the application entry point. Click Browse for the Main class, as shown in Figure 12.
Figure 12: Main Class>Browse
In Select Main Class, select the MainModule class in the main.module package, as shown in Figure 13, and click OK.
Figure 13: Selecting Main Class
With the Main class selected, click Finish, as shown in Figure 14.
Figure 14: JAR Export>Finish
The mainmodule.jar gets exported to the MainModule/modules directory, as shown in Package Explorer in Figure 15.
Figure 15: Exported JAR mainmodule.jar
In this section, we shall export the dependency project HelloJavaModule to a JAR file in the same directory as the main module JAR is exported to. To export the HelloJavaModule project to a JAR file, right-click the project in Package Explorer and select Export (see Figure 16).
Figure 16: Package Explorer>HelloJavaModule>Export
In the Export window, select Java>JAR file, as shown in Figure 17, and click Next.
Figure 17: Export>Java>JAR file>Next
In JAR File Specification, select the resource to export as the HelloJavaModule, as shown in Figure 18. Select the export destination the same as for the main module JAR, which is the MainModule\modules directory. The JAR file name would need to be different and is helloJavaModule.jar. Click Next.
Figure 18: JAR File Specification for Dependency JAR
Select the default JAR Packaging Options, as shown in Figure 19, and click Next.
Figure 19: Selecting Packaging Options
Next, customize the JAR Manifest Specification. Because the dependency project does not include a class for an application entry point, keep the Main class field as empty, as shown in Figure 20, and click Finish.
Figure 20: No Main Class for Dependency Project
The helloJavaModule.jar gets exported to the MainModule/modules directory, as shown in Package Explorer in Figure 21.
Figure 21: Exported JAR helloJavaModule.jar
To run the main module Java application, we need to create a run configuration for the MainModule project. Right-click MainModule in Package Explorer and select Properties, as shown in Figure 22.
Figure 22: Package Explorer>MainModule>Properties
In the Properties window, select Run/Debug Settings and click New… to create a new launch configuration, as shown in Figure 23.
Figure 23: Properties>Run Debug Settings>New…
In Select Configuration Type, select Java Application, as shown in Figure 24.
Figure 24: Selecting Configuration Type as Java Application
In the configuration wizard, specify a name (MainModuleConfig) in the Name field and with the Project selected as MainModule click Search… for the Main class, as shown in Figure 25.
Figure 25: Setting Launch Configuration Properties
In Select Main Type, select the main.module.MainModule type (see Figure 26) and click OK.
Figure 26: Selecting Main Type
With the Main class selected, click the Arguments tab to select the VM args next, as shown in Figure 27.
Figure 27: Selecting Arguments Tab
Add the following VM arguments to the VM arguments field, as shown in Figure 28.
--module-path modules/helloJavaModule.jar;modules/mainmodule.jar -m mainModule/main.module.MainModule
The --module-path arg sets the module path to the two JARs for the two modules. The -m arg sets the module. Click Apply, as shown in Figure 28.
Figure 28: Applying Run Configuration Settings
Click OK, as shown in Figure 29, to complete the run configuration.
Figure 29: Completing Run Configuration
A new run configuration, MainModuleConfig, gets created, as shown in Figure 30. Click Apply and Close in the Properties window.
Figure 30: Applying Properties for MainModule Project
Next, we shall test whether the main module invokes the dependency module by running the main module application. Right-click MainModule.java in Package Explorer and select Run As>Java Application (see Figure 31).
Figure 31: Package Explorer>MainModule>Run As>Java Application
The output from the Java application gets displayed in the Console, as shown in Figure 32. The message "Hello from" from the main module is combined with the message "Exported Java Module!" from the dependency module to output the message "Hello from Exported Java Module!".
Figure 32: Console Output
In two articles, we discussed using module dependencies in Java 9.