On 19/07/2016 19:38, Paul Benedict wrote:
I have a few questions regarding how to use the module API. Thanks for
reading.
1) Is Configuration.empty() meant to be an immutable singleton or a mutable
empty configuration? Is it supposed to be analogous to
Collections::emptyList/Map where it's a stand-in? I am asking based on the
javadoc alone.
Configurations are immutable. The primary use of empty() is to serve as
the parent for the Configuration of the boot layer.
2) Must all modules that could ever be loaded be specified on the module
path? I was hoping to find a hook where I could provide by own
implementation of ModuleFinder that has all that knowledge self-contained.
I think the answer may be Configuration::resolveRequires, but please
confirm.
Yes, you probably want something like this:
Configuration parent = Layer.boot().configuration();
Configuration cf = parent.resolveRequires(ModuleFinder.of(), myfinder,
Set.of("myroot"));
To resolve "myroot" and its transitive dependences to create a new
configuration. The two finders that you are specify are the before and
after finders. The details is in the javadoc. In this example then the
before finder is empty (doesn't find any modules) so it will attempt to
locate the modules in the parent configuration. If not found there then
they will be located with "myfinder". Whether you use a before or after
ModuleFinder will depend on whether you need to overriding modules in
the parent configuration or not.
3) What is the difference between adding a concealed package and not adding
the package at all? If no difference, I don't know why you would ever call
ModuleDescriptor.Builder.conceals()
Concealed packages are packages that are not exported. If you don't add
them then they will not be package of your module.
When creating a Configuration (like in the above) then they are
important to know when doing post resolution checks. It's an error, an
example, for your module M to have a package `p` and for it to read
another module that exports package p to M.
It's also important at runtime that the VM knows all the packages in the
module. Continuing the example, then suppose that class p.Foo is loaded.
The VM knows that this is in module M because you told it in advance
when defining the module to the VM. There is nothing in the the Foo
class file to help.
4) The aforementioned method (and all the others mostly) throws ISE if the
package is already concealed or exported and you try to change it. But does
the API really need a once-and-done requirement? You couldn't pass the
builder instance across a chain of decorators, for example, and have them
tweak each according to their own rules.
There are a few warts in the Builder API that will be resolved soon. The
original intention was to detect mis-uses as early as possible and not
delay to the build() method. A package cannot be both concealed and
exported at the same time for example. So assumed this will be cleaned up.
5) One of the criticisms (made to me) of scanning all packages for
annotations (such as a theoretical @Exported on a package) was that it
would take too much time. Okay.... However, the ModuleDescriptor is going
to have an collection of all packages regardless because it provides
packages() method. So is the data lazy or pre-initialized?
We use the ConcealedPackages class file attribute [1] as an optimization
to avoid scanning. Also for the modules in the run-time image then we do
a lot at link-time to minimize the cost of reconstituting the module
descriptors at run-time.
6) If Layers cannot be torn-down and recreated, what is the recourse to
modules that come and go dynamically? If you say "it is not supported",
then I don't see how one could adapt Configuration/Layer to applications
where it's acceptable to drop in new artifacts and have them spin-up. The
artifacts I have in mind are EE artifacts. It just sounds like nothing will
change in the EE world then because it's impossible to use these new
features there.
Layers (think leaf layers) are intended to be discarded and
re-instantiated (probably from a new configuration).
-Alan
[1] http://cr.openjdk.java.net/~mr/jigsaw/spec/lang-vm.html#jigsaw-2.3