java9-modules-tutorial

( Simple Module , Optional , Transitive , Cyclic , Qualified Exports , Module Graph , Observable , Aggregator , Package Naming Conflicts , Module Resolution Process )

Stars
8

Java 9 ++ modules full tutorial

Everything is tested with JDK 11.0.3

Complete PDF for the tutorial download

I tried to make a simple yet fun, including code examples and pictures tutorial about a hot and important topic which is JPMS(Java Platform Module System) which came in Java 9.

Highly based on java-9-new-features-in-simple-way-jshell-jpms-and-more and Jenkov Tutorials


1. ------------------- Simple module -------------------

Ps i have provided all the code in folders so you don't have to manually type it ;

Compile :

javac --module-source-path simple_module -d out1 -m moduleA

Run :

java --module-path out1 -m moduleA/pack1.Main

2. ------------------- Optional -------------------

Compile :

javac --module-source-path optional_module -d out2 -m moduleA,moduleB

Run :

java --module-path out2 -m moduleB/pack2.Main

3. ------------------- Transitive -------------------

Be careful not spaces are allowed between (moduleA,moduleB,moduleC)

Compile :

javac --module-source-path transitive_module -d out3 -m moduleA,moduleB,moduleC

Run :

java --module-path out3 -m moduleC/pack3.Main

4. ------------------- Cyclic -------------------

Compile :

javac  --module-source-path cyclic_module -d out4 -m moduleA,moduleB

This will produce the following error :

error: cyclic dependence involving moduleA requires moduleA;

5. ------------------- Qualified Exports-------------------

Compile :

javac --module-source-path qualified_module -d out5 -m exporterModule,moduleA,moduleB

The error:

 error: package pack2 is not visible
          import pack2.B;
                 ^
        (package pack2 is declared in module exporterModule, which does not export it to module moduleB)
        1 error

How to solve : Well as we can see that error happens because inside our exporterModule we allow access to pack2 only for moduleA :

Do you want to fix it ?

Simply export pack2 for moduleB also like this :

export pack2 to moduleA,moduleB;

Okay but now how to run sir ?

 java --module-path out5 -m moduleA/pack1.Test
 java --module-path out5 -m moduleB/pack1.Test

6. ------------------- Observable -------------------

Compile :

//TODO

Run :

 //TODO

7. ------------------- Aggregator -------------------

Compile :

 javac --module-source-path aggregator_module -d out7 -m aggregator,moduleA,moduleB,moduleC,useModule

Run :

 java --module-path out7 -m useModule/pack4.Main

8. ------------------- Module Graph -------------------

9. ------------ Package Naming Conflicts ------------

Compile :

 javac  --module-source-path name_conflicts_module -d out9 -m moduleA,moduleB,useModule

This will produce the following error :

error: module useModule reads package pack1 from both moduleA and moduleB
module useModule{
^
1 error

10. ------------ Module Resolution Process ------------

Compile :

  javac --java-module-path resolution_process_module -d out10 -m useModule,moduleA,moduleB,moduleC,moduleD

Run :

  java --module-path out10 --show-module-resolution -m useModule
Related Projects