Updated conformance text for Java SE 9 (JSR 379)
Tim Ellison
Tim_Ellison at uk.ibm.com
Mon Jul 24 13:33:34 UTC 2017
Now that Java has introduced the concept of an explicit "link" stage for
subsetting
the platform code, I think the conformance definition should differentiate
between
an implementation of the specification that is providing a set of modules
as open
APIs, and an implementation of the specification that is solely used to
power a
"closed-world" application.
In the one case, a conformant platform may be a subset, and should provide
a coherent
set of modules that implement a well-defined development/runtime platform.
In the other
case the implementation is being subset to provide a runtime fit for a
particular
purpose.
With this in mind, we can introduce two new definitions:
A “Platform Implementation“ of this specification means a set of modules
created to be
run with a variety of application programs, or linked with a specific
application to
produce an “Application Specific Implementation”, i.e. this is a library
and associated
runtime.
An “Application Specific Implementation” of this specification means a set
of modules
that are linked to a specific application such that the modules are not
observable at
runtime to code outside the application, i.e. this is a closed-world
application.
The conformance description would then go on to refer to these as follows:
A Platform Implementation of this specification must include the
`java.base`
module, _i.e._, must make that module observable. A Platform
Implementation may,
further, include one or more additional Java SE modules so long as the
set of Java SE modules that the Implementation includes is _closed_, …
An Application Specific Implementation of this specification is not
subject to the
same conformance requirements as a Platform Implementation of this
specification.
Please see further specific comments in-lined below.
Regards,
Tim
mark.reinhold at oracle.com wrote on 11/07/2017 18:10:38:
> Attached below is revised and expanded text for the "Conformance"
> subsection of the "Modular platform" section [1] of the Java SE 9
> (JSR 379) specification. This text straddles both the JPMS and
> Java SE 9 JSRs. To keep all of the conformance language in one
> convenient place I propose to include it only in the Java SE 9
> specification.
>
> This version clarifies some details in the previous version [2] and,
> further, specifies the manner in which the strong encapsulation of
> modules may be relaxed.
>
> Comments welcome.
>
> - Mark
>
> [1] http://cr.openjdk.java.net/~iris/se/9/java-se-9-pr-spec/#s7
> [2] http://mail.openjdk.java.net/pipermail/java-se-9-spec-experts/
> 2017-May/000020.html
>
> ----
>
> Every Implementation of this Specification must include the `java.base`
> module, _i.e._, must make that module observable. An Implementation
may,
> further, include one or more additional Java SE modules so long as the
> set of Java SE modules that the Implementation includes is _closed_,
> i.e., contains every Java SE module required, via `requires transitive`
> directives, by any member of the set. For a specific example, an
> Implementation that contains just the `java.base`, `java.sql`,
> `java.logging`, and `java.xml` modules is closed because the only
> `requires transitive` dependences are from `java.sql` to `java.logging`
> and `java.xml`,
and `java.base` if you are being transitive.
> and the latter two modules are members of the set.
>
> The Technology Compatibility Kit (TCK) for this Specification will be
> able to test all of the Java SE modules included in an Implementation,
consider: strike out "be able to"
> and it will require that set to be closed. An Implementation that
passes
> the TCK is considered to fully implement this Specification even if it
> does not include all of the Java SE modules.
consider: "...TCK is considered to implement this Specification correctly
even if..."
Saying it fully implements the spec with missing modules doesn't make
sense.
> If an Implementation of this Specification includes a Java SE module
then
How could an implementation of this specification *not* include an SE
module?
> it must fully implement the corresponding part of this Specification. It
> must, in particular, implement every API element of that module
including
> the module’s name, its exported packages, and any `requires
transitive`
> dependences. It must not export any of that module’s other packages
> without qualification.
>
> This Specification defines the Licensor Name Space on a module-by-module
> basis. Provided that an Implementation that fully implements this
> Specification includes the required Licensor Name Space for each
included
consider: replace "required" by "entire"?
> module then it is not considered to subset the Licensor Name Space.
<snip>
> An Implementation of this Specification may provide a means to create
> further Implementations. If it does so then any new Implementation must
> satisfy the constraints of the preceding paragraphs but need not include
> all of the modules present in the original Implementation.
</snip>
Why must it be an implementation of the specification that creates a
further
implementation? Maybe it is a builder tool, linker, stripper, etc.
> As an aid to migration, an Implementation may relax the strong
> encapsulation of the modules that it includes as follows:
>
> - An Implementation may provide a means to invoke its run-time system
> with one or more packages of one or more of its modules open to code
> in all unnamed modules, i.e., to code on the class path.
I suggest this should not be limited to invocation time, i.e. consider
replacing this sentence with:
- An Implementation may provide a means to open one or more packages
of one or more of its modules to code in all unnamed modules, i.e.,
to code on the class path.
> The first
> access to an element of such a package by a program via a reflection
> API must cause a warning to be issued on the standard error stream.
> Later accesses may also cause warnings to be issued.
This should be an implementation choice, not a spec requirement.
It is not going to be possible to define a meaningful "warning",
especially
in headless environments or places where the error console is not reified.
While I see the value in warnings at development time, requiring a warning
for every runtime invocation is unreasonable.
What will the JCK be checking to ensure this requirement is met?
> - An Implementation may, by default, open one or more packages of one
> or more of its modules to code in all unnamed modules. If it does
so
> then it must issue warnings as described in the previous paragraph.
Consider: dropping this warnings requirement.
> If it does so then it must, further, provide a means to invoke its
> run-time system without opening any packages of any of its modules.
>
> (The Reference Implementation's run-time system behaves this way by
> default, and because this is the default it can also be invoked
> without opening any of its packages via the command-line option
> `--illegal-access=deny`.)
<snip>
> - An Implementation may provide a means to request that additional
> warnings or debugging information, such as stack traces, be issued
> when elements of its open packages are accessed via a reflection
API.
>
> (The Reference Implementation's run-time system can be invoked with
> the command-line options `--illegal-access=warn` or
> `--illegal-access=debug` in order to request warnings or both
> warnings and stack traces, respectively, on each unique reflective
> access to any open Implementation package.)
</snip>
I suggest taking out the text between the <snip> markers.
This information is best provided in user docs rather than the conformance
definition, otherwise there will be a very long list of what /may/ be
done.
> Future revisions of this Specification are expected to mandate that all
> of an Implementation's modules be strongly encapsulated by default and,
> eventually, to disallow the above-described relaxation.
>
> As a further aid to migration, an Implementation may provide a means to
> invoke its run-time system in a way that establishes additional
Change to remove reference to invocation time, e.g. "...provide a means to
establish additional..."
> relationships between specific modules, identified by name, regardless
of
> the original declarations of those modules and regardless of whether
> those modules are included in the Implementation or are part of the
> application being run:
>
> - One module can be made to read another module.
>
> (The Reference Implementation provides this capability via the
> `--add-reads` command-line option.)
>
> - A package of one module can be opened to another module.
>
> (The Reference Implementation provides this capability via the
> `--add-opens` command-line option.)
>
> - A package of one module can be exported to another module.
>
> (The Reference Implementation provides this capability via the
> `--add-exports` command-line option.)
>
> - A package of one module can be opened or exported to every unnamed
> module.
>
> (The Reference Implementation provides this capability by allowing
> the special token `ALL-UNNAMED` to be used as a target of the
> `--add-opens` and `--add-exports` command-line options.)
>
> None of these capabilities, for any modules, may be operative by
default.
> A future revision of this Specification may disallow these capabilities.
>
Unless stated otherwise above:
IBM United Kingdom Limited - Registered in England and Wales with number
741598.
Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU
More information about the jpms-spec-observers
mailing list