Identifying right module
As Java platform itself has been modularized, the regular imports do not work unless the required module dependency is specified in module descriptor.
We can list modules using java --list-modules
This display all the 99 modules available (as of jdk 9.0.4) and identifying the right one may be cumbersome. Few tips to minimize the effort are that, all jdk modules are prefixed with jdk.* ,
javafx modules are prefixed with javafx.*
, and Java SE specification modules are prefixed with java.*.
And, the modules naming convention was precise enough to identify the right module with ease. For instance, xml api modules reside under java.xml.* and unsupported API’s are under jdk.unsupported.*.
Fig : All available platform modules in Java 9.0.4.
In addition, you can use java --describe-module <module-name>
to understand which packages are exposed to use.
For instance, to understand the available packages from java.xml module, you could do java --describe-module java.xml.
The following packages (with exports
)are exported from java.xml
module and can be accessed by any module that specify the same as a dependency in its module descriptor as below.
module module.name.goes.here {
.....
requires java.xml
.....
}
java.xml@9.0.4
exports javax.xml exports javax.xml.catalog exports javax.xml.datatype exports javax.xml.namespace exports javax.xml.parsers exports javax.xml.stream exports javax.xml.stream.events exports javax.xml.stream.util exports javax.xml.transform exports javax.xml.transform.dom exports javax.xml.transform.sax exports javax.xml.transform.stax exports javax.xml.transform.stream exports javax.xml.validation exports javax.xml.xpath exports org.w3c.dom exports org.w3c.dom.bootstrap exports org.w3c.dom.events exports org.w3c.dom.ls exports org.w3c.dom.ranges exports org.w3c.dom.traversal exports org.w3c.dom.views exports org.xml.sax exports org.xml.sax.ext exports org.xml.sax.helpers
java.base is defaultly available to all modules.
requires java.base mandated
The following are the interfaces being used by java.xml
module.
uses javax.xml.parsers.DocumentBuilderFactory uses javax.xml.parsers.SAXParserFactory uses javax.xml.validation.SchemaFactory uses javax.xml.stream.XMLInputFactory uses javax.xml.xpath.XPathFactory uses org.xml.sax.XMLReader uses javax.xml.stream.XMLEventFactory uses javax.xml.stream.XMLOutputFactory uses javax.xml.transform.TransformerFactory uses javax.xml.datatype.DatatypeFactory
java.xml
makes few packages accessable to specific platform modules. The same can be observed below. Meaning, for instance, com.sun.org.apache.xml.internal.dtm
is not accessible to any other module except java.xml.crypto.
qualified exports com.sun.org.apache.xml.internal.dtm to java.xml.crypto qualified exports com.sun.org.apache.xpath.internal.res to java.xml.crypto qualified exports com.sun.org.apache.xpath.internal.objects to java.xml.crypto qualified exports com.sun.org.apache.xpath.internal.functions to java.xml.crypto qualified exports com.sun.org.apache.xpath.internal to java.xml.crypto qualified exports com.sun.org.apache.xpath.internal.compiler to java.xml.crypto qualified exports com.sun.org.apache.xml.internal.utils to java.xml.crypto
The following packages are internal to java.xml
module and strongly encapsulated from outside world. No module would be able to access the below through modular approach.
contains com.sun.java_cup.internal.runtime contains com.sun.org.apache.bcel.internal contains com.sun.org.apache.bcel.internal.classfile contains com.sun.org.apache.bcel.internal.generic contains com.sun.org.apache.bcel.internal.util contains com.sun.org.apache.xalan.internal contains com.sun.org.apache.xalan.internal.extensions contains com.sun.org.apache.xalan.internal.lib contains com.sun.org.apache.xalan.internal.res contains com.sun.org.apache.xalan.internal.templates contains com.sun.org.apache.xalan.internal.utils contains com.sun.org.apache.xalan.internal.xsltc contains com.sun.org.apache.xalan.internal.xsltc.compiler contains com.sun.org.apache.xalan.internal.xsltc.compiler.util contains com.sun.org.apache.xalan.internal.xsltc.dom contains com.sun.org.apache.xalan.internal.xsltc.runtime contains com.sun.org.apache.xalan.internal.xsltc.runtime.output contains com.sun.org.apache.xalan.internal.xsltc.trax contains com.sun.org.apache.xalan.internal.xsltc.util contains com.sun.org.apache.xerces.internal.dom contains com.sun.org.apache.xerces.internal.dom.events contains com.sun.org.apache.xerces.internal.impl contains com.sun.org.apache.xerces.internal.impl.dtd contains com.sun.org.apache.xerces.internal.impl.dtd.models contains com.sun.org.apache.xerces.internal.impl.dv contains com.sun.org.apache.xerces.internal.impl.dv.dtd contains com.sun.org.apache.xerces.internal.impl.dv.util contains com.sun.org.apache.xerces.internal.impl.dv.xs contains com.sun.org.apache.xerces.internal.impl.io contains com.sun.org.apache.xerces.internal.impl.msg contains com.sun.org.apache.xerces.internal.impl.validation contains com.sun.org.apache.xerces.internal.impl.xpath contains com.sun.org.apache.xerces.internal.impl.xpath.regex contains com.sun.org.apache.xerces.internal.impl.xs contains com.sun.org.apache.xerces.internal.impl.xs.identity contains com.sun.org.apache.xerces.internal.impl.xs.models contains com.sun.org.apache.xerces.internal.impl.xs.opti contains com.sun.org.apache.xerces.internal.impl.xs.traversers contains com.sun.org.apache.xerces.internal.impl.xs.util contains com.sun.org.apache.xerces.internal.jaxp contains com.sun.org.apache.xerces.internal.jaxp.datatype contains com.sun.org.apache.xerces.internal.jaxp.validation contains com.sun.org.apache.xerces.internal.parsers contains com.sun.org.apache.xerces.internal.util contains com.sun.org.apache.xerces.internal.utils contains com.sun.org.apache.xerces.internal.xinclude contains com.sun.org.apache.xerces.internal.xni contains com.sun.org.apache.xerces.internal.xni.grammars contains com.sun.org.apache.xerces.internal.xni.parser contains com.sun.org.apache.xerces.internal.xpointer contains com.sun.org.apache.xerces.internal.xs contains com.sun.org.apache.xerces.internal.xs.datatypes contains com.sun.org.apache.xml.internal.dtm.ref contains com.sun.org.apache.xml.internal.dtm.ref.dom2dtm contains com.sun.org.apache.xml.internal.dtm.ref.sax2dtm contains com.sun.org.apache.xml.internal.res contains com.sun.org.apache.xml.internal.resolver contains com.sun.org.apache.xml.internal.resolver.helpers contains com.sun.org.apache.xml.internal.resolver.readers contains com.sun.org.apache.xml.internal.resolver.tools contains com.sun.org.apache.xml.internal.serialize contains com.sun.org.apache.xml.internal.serializer contains com.sun.org.apache.xml.internal.serializer.dom3 contains com.sun.org.apache.xml.internal.serializer.utils contains com.sun.org.apache.xml.internal.utils.res contains com.sun.org.apache.xpath.internal.axes contains com.sun.org.apache.xpath.internal.jaxp contains com.sun.org.apache.xpath.internal.operations contains com.sun.org.apache.xpath.internal.patterns contains com.sun.xml.internal.stream contains com.sun.xml.internal.stream.dtd contains com.sun.xml.internal.stream.dtd.nonvalidating contains com.sun.xml.internal.stream.events contains com.sun.xml.internal.stream.util contains com.sun.xml.internal.stream.writers contains jdk.xml.internal
Similarly, you can see the contents of any module and understand the packages that are exported to be used and which are internal to a specific module. This helps in migrating to Java 9 modular implementation. At first it appears to be a daunting task to get knowledge of the required package's parent module. But the meaningful prefixes of the modules and describing the module for better insight would help you in accelerating the approach.