javac modes
Jonathan Gibbons
jonathan.gibbons at oracle.com
Sun Apr 4 21:57:11 PDT 2010
In the new world of JDK 7, modules, and Jigsaw, we are beginning to see
to more talk of "modes", such as the ability of the JVM to run code in
"legacy mode" or "module mode". javac has some additional kinds of
modes, which are all somewhat independent of each other, and which
should not be confused. This note attempts to describe the different
kinds of modes supported by javac.
1. JVM execution mode
This refers to the way in which javac is run by the underlying JVM.
1.a) module mode
In module mode, the javac launcher invokes the javac module directly.
1.b) legacy mode
In legacy mode, the javac launcher invokes javac using a main class and
a class path.
1.c) bootstrap mode
In bootstrap mode, javac is executed by putting the classes for javac on
the JVM bootclasspath of an earlier version of javac. (javac
-J-Xbootclasspath/p:javac.jar ...) The javac classes must have been
compiled for use with that earlier version. This mode is always used to
compile the rest of the JDK classes.
The default JVM execution mode for javac is a property of how the javac
launcher is created. Module mode and legacy mode can be selected by
using the JVM's -Xmode option, which can be escaped through the javac
command line using -J in the normal manner. (i.e. javac -J-Xmode:legacy
...)
In module mode, the javac launcher will use the default system module
library to locate the javac module. See the mail thread [1] for a
discussion of using the JVM -L option to change the module library used
to locate the javac module and the modules it depends on.
For the most part, javac's functionality is independent of the JVM
execution mode used to start javac. However, some of javac's other modes
rely on a system property "sun.boot.class.path" being set by the JVM
runtime to a path for the standard runtime classes, such as found in
rt.jar or its equivalent. See mail thread [2] for more discussion on
sun.boot.class.path.
2. Module resolution mode
This refers to the way in which javac locates classes and resolves
module dependencies. Some of the modes here are just for bootstrapping
and testing purposes.
2.a) Jigsaw mode
This is the primary, default, module resolution mode. It requires that
javac has access to the org.openjdk.jigsaw API, and that a module
library is available, meaning that either a library has been specified
with the -L option, or javac has been run in the module JVM execution
mode (1.a, above.)
2.b) 294 RI mode
This has been newly identified, and is not yet supported. It will likely
be akin to a subset of Jigsaw mode, in which module properties are
inferred from the compilation environment without the use of
module-info.java.
2.c) ZeroMod mode
ZeroMod refers to a primitive module resolver built directly into javac.
It is primarily intended for bootstrapping (i.e. building JDK without
the benefit of Jigsaw itself) and for testing those aspects of javac
functionality which do not directly depend on Jigsaw functionality. It
is used if javac is executed in bootstrap or legacy mode: i.e. if the
Jigsaw API is not available or if no module library is available. This
mode can also be forced by the use of the hidden javac option
-XDzeroMod. The ZeroMod module resolver provides only very minimal
support for version queries and version selection.
2.d) No modules mode
Modules are not supported in this mode. Classes are located in the same
way as for earlier versions of javac. It can be thought of as "javac's
legacy mode". This mode can be selected with the hidden javac option
-XDnomodules, although it is intended that this is for debugging and
testing purposes only. javac provides equivalent legacy command line
functionality using "single-module" mode (3.a) and any of the other
module resolution modes (2.a, 2.b, 2.c) although the internal code paths
within javac will be different in these cases.
3. Module compilation mode
This refers to whether javac is compiling classes for multiple modules
at the same time, or not.
3.a) Single module mode
This is used to compile non-modular code or for code in a single module.
This is the mode that will be automatically used for any javac command
line that was valid for earlier versions of javac. In this mode, the -d,
-classpath and -sourcepath options all have the same usage as before.
3.b) Multi-module mode
This is used to compile source code for multiple modules in the the same
compilation. It is used if the new option "-modulepath" is used instead
of "-classpath". In this mode, the -d and -sourcepath options both use
an extra level of directory naming above the standard package directory
hierarchy.
In both modes, a module or modules found on the command line (either
explicitly or on one of the available path options) will be taken into
account by the module resolver, which will look for any unresolved
dependencies in the system module library, or a library specified by the
-L option. Note that this means that in Jigsaw mode (2.a) javac will
create and use a "temporary library" in memory to handle the modules
found in the compilation environment.
---------------------
[1] -L:
http://mail.openjdk.java.net/pipermail/jigsaw-dev/2010-April/000756.html
[2] sun.boot.class.path
http://mail.openjdk.java.net/pipermail/jigsaw-dev/2010-April/000758.html
More information about the jigsaw-dev
mailing list