TheJava Platform Module System[1] specifies a distribution format for collections ofJava code and associated resources. It also specifies a repository for storing these collections, ormodules, and identifies how they can be discovered, loaded and checked for integrity. It includes features such as namespaces with the aim of fixing some of the shortcomings in the existingJAR format, especially theJAR Hell, which can lead to issues such as classpath and class loading problems.
The Java Module System was initially being developed under theJava Community Process as JSR 277 and was scheduled to be released with Java 7.
JSR 277 later was put on hold and Project Jigsaw[2] was created to modularize the JDK. This JSR was superseded by JSR 376 (Java Platform Module System).
Project Jigsaw was originally intended forJava 7 (2011) but was deferred toJava 8 (2014) as part of Plan B,[3] and again deferred to aJava 9 release in 2017.[4] Java 9 including the Java Module System was released on September 21, 2017.[5]
The Java Module System implemented in Java 9 includes the followingJEPs andJSR (Java Specification Request):[2]
Additionally, several other JDK 9 features have been added to ease transition to the module system:
Modules are a new way of grouping code. Contrary toJar files, modules explicitly declare which modules they depend on, and what packages they export.[12] Explicit dependency declarations improve the integrity of the code, by making it easier to reason about large applications and the dependencies between software components.
The module declaration is placed in a file namedmodule-info.java at the root of the module’s source-file hierarchy. The JDK will verify dependencies and interactions between modules both at compile-time and runtime.
For example, the following module declaration declares that the modulecom.foo.bar depends on anothercom.foo.baz module, and exports the following packages:com.foo.bar.alpha andcom.foo.bar.beta:
modulecom.foo.bar{requirescom.foo.baz;exportscom.foo.bar.alpha;exportscom.foo.bar.beta;}
The public members ofcom.foo.bar.alpha andcom.foo.bar.beta packages will be accessible by dependent modules. Private members are inaccessible even through a means such asreflection. Note that inJava versions 9 through 16, whether such 'illegal access' isde facto permitted depends on a command line setting.[13]
The JDK itself has been modularized inJava 9.[14] For example, the majority of the Java standard library is exported by the modulejava.base
.
Modules can themselves be imported, automatically importing all exported packages.[15] This is done usingimport module
. For example,importmodulejava.sql;
is equivalent to
importjava.sql.*;importjavax.sql.*;// Remaining indirect exports from java.logging, java.transaction.xa, and java.xml
Similarly,importmodulejava.base;
, similarly, imports all 54 packages belonging tojava.base
.
Modules use the followingkeywords:
exports
: used in a module declaration to specify which packages are available to other modulesmodule
: declares a moduleopen
: indicates that all classes in a package are accessible via reflection by other modulesopens
: used to open a specific package for reflection to other modulesprovides
: used to declare that a module provides an implementation of a service interfacerequires
: used in a module declaration to specify that the module depends on another moduleto
: used with theopens
directive to specify which module is allowed to reflectively access the packagetransitive
: used with therequires
directive to indicate that a module not only requires another module but also makes that module's dependencies available to modules that depend on ituses
: used in a module to declare that the module is using a service (i.e. it will consume a service provided by other modules)with
: used with theprovides
directive to specify which implementation of a service is provided by the moduleThe modules under namespacejava.*
belong to theJava Platform, Standard Edition, and modules under namespacejdk.*
belong to theJava Development Kit.[16]
java.base | Defines the core APIs that form the foundation of the Java SE Platform. Implicitly required by all modules and does not need to be declared with |
---|---|
java.compiler | Defines APIs related to the language model,Java annotation processing, and theJava compiler. |
java.datatransfer | Defines the APIs that facilitate data transfer between applications or within an application. |
java.desktop | Defines theAbstract Window Toolkit (AWT) andSwing libraries for user interfaces, along with APIs for accessibility, audio, imaging, printing, andJavaBeans. |
java.instrument | Defines services that allow for the instrumentation of programs running on theJava Virtual Machine (JVM). |
java.logging | Defines the API forlogging events in Java applications (Java Logging API). |
java.management | Defines the APIs for theJava Management Extensions (JMX) framework. |
java.management.rmi | Defines theRemote Method Invocation (RMI) connector for the Java Management Extensions (JMX) Remote API. |
java.naming | Defines the API forJava Naming and Directory Interface (JNDI) services. |
java.net.http | Defines the API forHTTP client andWebSocket functionality. |
java.prefs | Defines the API for managing and storing user preferences. |
java.rmi | Defines the Remote Method Invocation (RMI) API for object communication across Java virtual machines. |
java.scripting | Defines the API for integratingscripting engines into Java applications (Scripting API). |
java.se | Defines the standard API for the Java SE Platform. |
java.security.jgss | Defines the Java binding for theIETFGeneric Security Services API (GSS-API) for security contexts. |
java.security.sasl | Defines Java's support for theSimple Authentication and Security Layer (SASL) protocol. |
java.smartcardio | Defines the API for interacting withsmart card devices (Java Smart Card I/O API). |
java.sql | Defines theJava Database Connectivity (JDBC) API for database interaction. |
java.sql.rowset | Defines the JDBC RowSet API for managing and interacting with tabular data in Java. |
java.transaction.xa | Defines an API for managing distributed transactions within JDBC. |
java.xml | Defines theJava API for XML Processing (JAXP), including tools for parsing and transforming XML data. |
java.xml.crypto | Defines the API forcryptographic operations with XML data. |
jdk.accessibility | Defines utility classes for implementingAssistive Technologies in the JDK. |
jdk.attach | Defines the attach API for connecting to and interacting with a running JVM instance (attach API). |
jdk.charsets | Provides additionalcharacter sets (charsets), including double-byte and IBM-specific charsets, not included injava.base . |
jdk.compiler | Defines the internal implementation of the Java compiler and the command-line tooljavac. |
jdk.crypto.cryptoki | Defines the implementation of the SunPKCS11 security provider for cryptographic operations. |
jdk.dynalink | Defines the API for dynamically linking high-level operations on objects. |
jdk.editpad | Implements the edit pad service used byjdk.jshell for evaluating code. |
jdk.hotspot.agent | Provides the implementation for theHotSpot Serviceability Agent. |
jdk.httpserver | Defines the JDK-specific HTTP server API and thejwebserver tool for running a simple HTTP server. |
jdk.incubator.vector | Defines the API for expressing computations that can be compiled into SIMD instructions at runtime, such as AVX or NEON instructions. |
jdk.jartool | Provides tools for manipulatingJava Archive (JAR) files, such as thejar andjarsigner commands. |
jdk.javadoc | Defines the system documentation tool implementation and its command-line version,javadoc. |
jdk.jcmd | Defines tools for diagnosing and troubleshooting JVM processes, includingjcmd,jps, andjstat. |
jdk.jconsole | Defines the JMX-based graphical tool,jconsole, for monitoring and managing Java applications. |
jdk.jdeps | Defines tools for analysing dependencies in Java programs and libraries, such asjdeps,javap,jdeprscan, andjnativescan. |
jdk.jdi | Defines theJava Debug Interface (JDI) for debugging Java applications. |
jdk.jdwp.agent | Provides the implementation of theJava Debug Wire Protocol (JDWP) agent for remote debugging. |
jdk.jfr | Defines the API forJDK Flight Recorder (JFR) for collecting performance and diagnostic data. |
jdk.jlink | Defines thejlink tool for creating custom runtime images, andjmod andjimage tools for managing JMOD and JDK container files. |
jdk.jpackage | Defines theJava packager tool (jpackage) for creating platform-specific application packages. |
jdk.jshell | Provides thejshell tool for interactively evaluating Java code snippets. |
jdk.jsobject | Defines the API for integratingJavaScript objects in Java applications. |
jdk.jstatd | Defines thejstatd tool for remotely monitoring JVM statistics. |
jdk.localedata | Provides locale-specific data for non-US locales. |
jdk.management | Defines JDK-specific management interfaces for JVM monitoring and control. |
jdk.management.agent | Defines the JMX-based management agent for the JVM. |
jdk.management.jfr | Defines the management interface for JDK Flight Recorder (JFR). |
jdk.naming.dns | Implements theDNS Java Naming provider for resolving domain names. |
jdk.naming.rmi | Implements the RMI Java Naming provider for remote method invocation. |
jdk.net | Defines the JDK-specific API for network programming. |
jdk.nio.mapmode | Defines specific file mapping modes available in the JDK. |
jdk.sctp | Provides the API forStream Control Transmission Protocol (SCTP) in the JDK. |
jdk.security.auth | Implements authentication modules and security-related interfaces within thejavax.security.auth package (interfaces injavax.security.auth.* ). |
jdk.security.jgss | Defines extensions to the GSS-API and the implementation of the SASL GSSAPI mechanism in the JDK. |
jdk.xml.dom | Defines the JDK's subset of theWorld Wide Web Consortium (W3C)Document Object Model (DOM) API not covered by Java SE. |
jdk.zipfs | Provides the implementation for the ZIP file system provider, enabling access toZIP files as file systems. |
The Java Module System does not intend to support all the functionalities that theOSGi platform currently supports (for example the Life-Cycle model and the Services Registry). However the Java Module System will support functions which are not supported by OSGi, such as modularity at compile-time, and built-in support for native libraries.[17] A couple of articles exploring how the Java Module System and OSGi could interoperate were published in 2016. These can be found on InfoQ[18] and also the OSGi Alliance Blog.[19]