Concerns mapping existing dynamic module systems to a 1-1 Module->Layer

Thomas Watson tjwatson at us.ibm.com
Wed Mar 8 21:33:09 UTC 2017


> From: mark.reinhold at oracle.com
> To: Thomas Watson/Austin/IBM at IBMUS
> Cc: jpms-spec-experts at openjdk.java.net
> Date: 03/08/2017 02:08 PM
> Subject: Re: Concerns mapping existing dynamic module systems to a 
> 1-1 Module->Layer
> 
> 2017/3/8 6:09:11 -0800, tjwatson at us.ibm.com:
> > There have been several topics recently discussing concerns in one 
context 
> > or another when trying to use JPMS with an existing module system 
(like 
> > OSGi or JBoss Modules) where the existing module system supports 
dynamic 
> > modules.
> > 
> > At a high level, the solution involves a 1-1 mapping for 
Module->Layer. 
> >  This allows such a dyamic module system to make use of the dynamic 
Layer 
> > creation to support the existing module system.
> > 
> > From my experience there are some performance concerns that come in 
three 
> > different categories when using a 1-1 mapping between the Module and 
> > Layer.
> > 
> > ...
> > 
> > Altogether the overhead appears to be 4-5 ms per module (on a pretty 
> > snappy machine).  Caching the discovery of private packages does cut 
that 
> > by at least half.  Most of the remaining overhead can be attributed to 
the 
> > fact that we are using 1-1 Module->Layer mappings in order to support 
> > dynamics as well as hiding our own resolution wires that do not fit 
into 
> > the strict rules of JPMS when dealing with split packages or cycles.
> > 
> > Most of the additional methods David Lloyd is suggesting is to get the 

> > functionality needed to do the complete mapping of existing module 
systems 
> > into JPMS.  Essentially I think we are trying to work with JPMS in 
order 
> > to solve the following requirement [1]:
> > 
> > Interoperation — It must be possible for another module system, such 
as 
> > OSGi, to locate Java modules and resolve them using its own resolver, 
> > except possibly for core system modules.
> 
> To clarify, this requirement does not imply bidirectional interoperation
> with dynamic module systems, as we've been discussing here.  All that
> this requirement means is that another module system must be able to 
read
> JPMS module metadata in order to resolve JPMS modules on its own terms.
> In the case of OSGi, e.g., a suitably-enhanced framework implementation
> could use the `java.lang.module.ModuleFinder` API to locate a module's
> definition, and then use the `ModuleReader` API to read its metadata and
> content to synthesize a corresponding OSGi bundle that's loaded by an
> otherwise-ordinary OSGi class loader.

I can confirm that this is possible, I have implemented something along 
these lines.  But I imagine there are going to be JPMS modules out there 
that will not function correctly when their own classes start returning an 
unnamed module from Class.getModule().  In my opinion, for a JPMS module 
to be loaded as a bundle in OSGi the classes for that bundle must be 
associated with a named module.

> 
> Support for bidirectional interoperation is not mandated by the agreed
> requirements nor by the original JSR submission, as I've noted 
previously
> [2].  I thought we'd found a way to achieve this stretch goal for OSGi,
> but this recent discussion suggests that further research and 
exploration
> is required.  I hope you'll understand that I'm reluctant to delay this
> JSR any further in order to accommodate such work.
> 
> > While the solution we have today achieves this to some extent it is 
not 
> > obvious to me that we have done this in the most useful of ways.  In 
> > particular, all the additions David is suggesting are being resisted 
> > because they potentially are exposing internal implementation details 
of 
> > the JVM which is not desired by the JVM team.  To be a complete 
solution 
> > for the JBoss case all (most?) of the methods David suggests are 
needed. 
> >  As I stated already, OSGi really only needs the addPackage and 
> > addExportsToAll methods to be complete.  But this still requires 
double 
> > resolution work to get us back to the functionality we were at with 
Java 8 
> > and that is only if the suggested methods make it into java 9.
> 
> No changes to OSGi implementations, nor to JPMS, should be required in
> order for OSGi implementations to achieve the level of functionality 
that
> they have on Java 8.  An OSGi implementation should run just fine on top
> of Java 9, without interacting directly with JPMS in any way.  (If it
> doesn't then there's a bug somewhere, in which case please report it and
> we'll fix it.)  What we've been discussing here goes well beyond the
> functionality available on Java 8.

Understood.  Let me clarify.  With an enhanced OSGi framework that loads 
OSGi bundles as JPMS modules/layers we cannot achieve the same level of 
OSGi functionality as would be possible when running in the compatibility 
unnamed module space (or on top of Java 8). 

> 
> > Taking a certain interpretation of the above requirement seems to 
imply 
> > that we should be able to have a solution that does not require double 

> > resolution at the JPMS Layer.  It seems to implies that we should be 
able 
> > to use our own resolver to wire the modules for our own module system 
how 
> > ever we see fit.  But I don't think that is really what we got with 
the 
> > current solution which requires JPMS module resolution and then us 
using 
> > the controller to provide the read edges required by our module system 

> > class loaders.  I was not in on the early discussions of JPMS, but was 

> > there any thread of discussion about an approach that provided a 
> > pre-resolved graph to JPMS?
> 
> No, not that I recall.
> 
> >                              It seems like such a solution would 
naturally 
> > fit into the spirit of the interoperation requirement.  I acknowledge 
that 
> > such an idea is a drastic turn in the current design and I don't see 
how 
> > they could be contained in any reasonable way.
> 
> That would indeed be an enormous change at this point in time, and it
> would be justified only by a stretch goal rather than by an agreed
> requirement.
> 
> > I think we are left with the Layer Controller now for better or worse. 
 I 
> > hope the overhead of creating and resolving 100s of Layers can be 
> > optimized in the future so we can avoid having to do this largely 
> > unnecessary resolution work when dealing with existing module systems. 

> >  But if the Controller is what we are left with I think the solution 
needs 
> > to be as complete as possible for the usecases it is used for.  Namely 
to 
> > do the adhering of JBoss Modules and OSGi into JPMS.
> 
> Sorry, but I remain unwilling to expose the requested low-level 
primitive
> operations, for the reasons previously stated.  If the 
`Layer.Controller`
> API is insufficient as it stands today then we should defer support for
> bidirectional interoperation to a future release.

The Layer.Controller gives us the tools to necessary to achieve a form 
bidirectional support.  The Controller should not be dropped from Java 9.

> 
> - Mark
> 
> 
> [1] http://openjdk.java.net/projects/jigsaw/spec/reqs/
> 2015-04-01#interoperation
> [2] http://mail.openjdk.java.net/pipermail/jpms-spec-experts/2016-
> October/000410.html
> 

Tom




More information about the jpms-spec-experts mailing list