RFR: JDK-8220702: compiling in the context of an automatic module disallows --add-modules ALL-MODULE-PATH
Alex Buckley
alex.buckley at oracle.com
Wed Apr 10 18:51:40 UTC 2019
// Adding jigsaw-dev -- this topic is slightly deeper than it appears.
On 4/9/2019 4:43 AM, Jan Lahoda wrote:
> Currently, when compiling an unnamed module, --add-modules
> ALL-MODULE-PATH adds all modules from the module path to the module
> graph, so that the unnamed module can refer to them.
(See also http://openjdk.java.net/jeps/261#Root-modules plus the section
"Root modules" in the java.lang.module package spec.)
> When compiling a named module, this option is not allowed, as it would
> be confusing, as it cannot modify the dependencies of the named module.
>
> But, when compiling a code in the context of an automatic module using
> --patch-module, e.g.:
> javac --module-path <automatic-module> --patch-modules
> <automatic-module-name>=<dir> ...
>
> The --add-modules ALL-MODULE-PATH is still disallowed, but it may make
> sense to use it, as it may affect the set of classes available for the
> sources that are being compiled. Compiling in the context of an
> automatic module may be useful esp. in when patching multiple modules at
> once (which is supported by --patch-module), e.g. to build tests. (Seems
> that also at least the use of javadoc in Maven may lead to a similar
> setting as well, see the JBS bug.)
JEP 261 doesn't discuss compiling code "in the context of an automatic
module", and javac's reference guide doesn't imply that `--patch-module`
supports it, but it is clearly a plausible and useful thing to do, so
thanks for calling it out.
There is a question to be answered: When the compiler compiles code in
an automatic module (due to the code being observed in a directory that
is specified to --patch-module), then what is the _default set of root
modules_ for the automatic module?
I expect the answer is: the same as the default set of root modules for
the unnamed module. And actually, for the `javac` invocation shown
above, which is single-module mode, this answer is given in the "Compile
time" section of JEP 261
(http://openjdk.java.net/jeps/261#Compile-time). Unfortunately, the
answer is only accidentally right, because the section did not envisage
compiling code in an automatic module; for the `javac` invocation above,
the section says "source files will be compiled as members of the
unnamed module".
So, there's another question to be answered: Does `javac` support
compiling code in an automatic module in single-module mode, or
multi-module both, or either? Once we know this, we can update the
"Compile time" section and answer the set-of-root-modules question.
> The proposal is to allow the --add-modules ALL-MODULE-PATH option when
> compiling code in the context of an automatic module.
I support this proposal, subject to the questions raised above.
A CSR will be needed; in addition to specifying the things mentioned
above, it can clarify the description of ALL-MODULE-PATH w.r.t. when it
can be used at compile time. Currently, the description seems unsure
about when it can be used.
(For reference, the text: "As a final special case, at both run time and
link time, if <module> is ALL-MODULE-PATH then all observable modules
found on the relevant module paths are added to the root set.
ALL-MODULE-PATH is valid at both compile time and run time. This is
provided for use by build tools such as Maven, which already ensure that
all modules on the module path are needed. It is also a convenient means
to add automatic modules to the root set.")
Alex
> Proposed patch: http://cr.openjdk.java.net/~jlahoda/8220702/webrev.01/
> JBS: https://bugs.openjdk.java.net/browse/JDK-8220702
>
> What do you think?
>
> Thanks,
> Jan
More information about the jigsaw-dev
mailing list