Jigsaw Quick Start (Obsolete)
This page is obsolete, it has been replaced by a new Quick Start Guide.1. Module Declaration
module-info.java
Each module has a module declaration,"module-info.java"
, specifying the module name,
version, and its dependencies. For example, the following is the
module-info.java
for the "com.greetings"
module.
module com.greetings @ 0.1 { requires org.astro @ 1.2; // requires a specific version class com.greetings.Hello; }
This com.greetings
module is of version 0.1 and it
requires the org.astro
module. It also declares its
main entry point com.greetings.Hello
class. The
modular compilation unit grammar is described at https://openjdk.org/projects/jigsaw/doc/lang-vm.html.
This module-info.java
doesn't specify any platform
module and thus by default it will require the full JRE module
("jdk"
). You can specify to require the
"jdk.base"
module and any other platform module like
this:
module com.greetings @ 0.1 { requires jdk.base; // default to the highest available version requires org.astro @ 1.2; class com.greetings.Hello; }
Structuring the source tree
For module compilation, the java compiler needs to be able to find the complete module content (module-info.java
and
classes for each module in source form or in a compiled form). The
ModulePath is introduced to make javac module-aware that
can compile one or multiple modules. This section describes the
ModulePath briefly and please refer to Modules
and javac slides for details.
The module-info.java
is placed in the root of the
source tree of the module's classes. For example, the root of the
source tree is under src/classes
directory. To evolve
from single-module structure of ClassPath, its
module-info.java
file should be placed under it.
src/classes/com/greetings/Hello.java src/classes/module-info.javaFor multiple modules, the source tree for each module are placed in its own subdirectory under the
<modulepath>
directory. For example, src
is the ModulePath. The
source tree for com.greetings
module and
org.astro
module are in separate subdirectories under
the src
directory.
src/com.greetings/module-info.java src/com.greetings/com/greetings/Hello.java src/org.astro/module-info.java src/org.astro/org/astro/World.javaWhen compiling multiple modules,
-modulepath
option:
$ javac -d modules -modulepath modules -sourcepath src \ `find src -name '*.java'`This will output to multi-module structure.
2. Compile a module
For example, thesrc
directory contains two modules,
com.greetings
and org.astro
modules with
the following source files:
$ cat src/com.greetings/com/greetings/Hello.java package com.greetings; import org.astro.World; public class Hello { public static void main(String[] args) { System.out.println("Hello, " + World.name() + "!"); } } $ cat src/org.astro/module-info.java module org.astro @ 1.2 { exports org.astro; } $ cat src/org.astro/org/astro/World.java package org.astro; public class World { public static String name() { return "world"; } }
$ find src -print src src/com.greetings src/com.greetings/module-info.java src/com.greetings/com src/com.greetings/com/greetings src/com.greetings/com/greetings/Hello.java src/org.astro src/org.astro/module-info.java src/org.astro/org src/org.astro/org/astro src/org.astro/org/astro/World.java
$ javac -d modules -modulepath modules -sourcepath src \ `find src -name '*.java'`This compiles all java files under the
src
directory
and outputs to the "modules"
directory in multi-module
structure.
3. Install a module in a module library
A modular JDK has a system module library in which the platform modules are installed. You can create your own module library using thejmod
command:
$ jmod -L mlib create # this creates a module library "mlib"Each module library has a parent. By default, it uses the system module library as its parent. The
"-P"
option can be
used to specify a parent module library. A module will be searched
from the module library first; if not found, it will delegate to
its parent.
You can install one or modules in a module library like this:
$ jmod -L mlib install modules org.astro com.greetingsYou can also install a jmod file in a module library.
Currently, there is no jmod option to remove a module from a module library. The workaround is to remove the module content directly:
$ rm -rf mlib/com.greetings
4. Run a module
To run thecom.greetings
module installed in the
"mlib"
module library:
$ java -L mlib -m com.greetings Hello world!The new
"-m"
option must be used to run an application
in module mode; otherwise, the application will be run in legacy
mode.
5. Create a jmod file
Package thecom.greetings
as a jmod file using the
jpkg
command:
$ jpkg -m modules/com.greetings jmod com.greetings $ jpkg -m modules/org.astro jmod org.astroFiles
com.greetings@0.1.jmod
and
org.astro@1.2.jmod
will be created. To install the
jmod files in a module library:
$ jmod -L mlib install com.greetings@0.1.jmod org.astro@1.2.jmod
Other Useful Commands
$ jmod -L mlib ls # list all modules installed in mlib com.greetings@0.1 org.astro@1.2 $ jmod -L mlib ls -v # list with verbose com.greetings@0.1 requires org.astro@=1.2 requires jdk@=8-ea org.astro@1.2 requires jdk@=8-ea exports org.astro $ jmod -L mlib dump-config com.greetings configuration roots = [com.greetings@0.1] context +com.greetings module com.greetings@0.1 local (1) com.greetings.Hello:com.greetings@0.1 remote (1101) org.astro=+org.astro [...]