On 01/09/2016 08:16 AM, Alan Bateman wrote:
On 07/01/2016 23:39, Jonathan Gibbons wrote:
:
This note suggests a similar-but-different approach.
The proposal is that it should be possible to represent an entry on
the module path as a text file in Java properties file format, such
that it provides a mapping from a module name to a location on the
host system where the contents of the module can be found. The
representation of the module itself could be any form that could
otherwise appear in a directory on the module path, such as a modular
jar or exploded module. Just as a file system directory provides a
mapping from a name to the content of a module, so too could such a
properties file, which could be created at minimal cost, without
copying any files, and which would work uniformly across all
platforms. Although there need not be any inherent restrictions on
the use of such entries on the module path, in the extreme case, the
location of all the application modules for an application could be
specified in a single properties file entry on the application module
path.
While conceptually similar to the use of @-files, the use of property
files to express a large number of entries on a module path would
provide a more structured solution that would be uniformly adopted
across all tools that process module paths, including but not limited
to the Java launcher (java), linker (jlink), and compiler (javac).
Allowing an entry to be text file is nice but I wonder if a file of
just locations could work too.
With the existing module path then javac or the runtime needs to look
at all modules in a directory to get their name and check for
duplicates. It could do the same with a file of just locations. One
benefit is that it avoids the error case where a name maps to a
location of a module that has a different name.
One other thing to mention is service binding as this involves finding
all modules that provide implementations of a service type. A name ->
location doesn't help with that as it essentially amounts of finding
all modules. I can see name -> location helping the compiler of course
as it won't need to examine all modules.
Assuming this moves forward then there are details to work out: The
file encoding is one that isn't as obvious as it might seem because
the locations/property values are file paths. For relative file paths
then they could be relative to the properties file or relative to the
working directory. One other thing is the ModuleFinder API, the
of(Path[]) method might have to change to of(String[]) or an overload
introduced.
-Alan
I think there are enough advantages to using a properties file that it
is worth consideration, unless there are serious technical reasons (such
as difficulty using java.util.Properties::load while bootstrapping the
system) to avoid them.
One of the implications of specifying a properties file format was that
java.util.Properties specifies an encoding of ISO 8859-1, and how to
escape characters within that. However, there is also JEP 226,
investigating UTF-8 property files. The point here is that we can
leverage existing well known standards for specifying this file.
It is not clear to me there is any significant benefit from avoiding the
error case where a name maps to a module of a different name. Yes, that
should be checked if and when the full module declaration is accessed,
but the error is not materially different from any of the other errors
that can occur when reading a module declaration. And there are
significant benefits from specifying that the name must be available in
the properties file, because it will help to avoid opening and reading
the module definition unnecessarily.
The name->location mapping helps _all_ consumers of the module path,
including service binding, because it can be used to avoid opening
modules that have been shadowed by entries appearing earlier on the path.
The question about relative paths in the file is more interesting. I
would expect that most uses of this feature would use absolute paths. If
a relative path was used, then a path relative to the directory
containing the properties file would make the most sense.
Finally, I don't see the need to change the signature of
ModuleFinder.of(Path...) method, other that to change the name of the
parameter from "dirs" to "paths", such that one of the entries in the
array could be the path for a properties file, just as it might be the
path for a modular jar file as discussed in alternative proposals. In
other words, I would assume that ModuleFinder.of would provide direct
support for reading properties files as well as directories, as a means
of locating module definitions.
-- Jon