Dynamic modules and bidirectional interoperation

Remi Forax forax at univ-mlv.fr
Fri Oct 28 15:41:41 UTC 2016



----- Mail original -----
> De: "mark reinhold" <mark.reinhold at oracle.com>
> À: "Thomas Watson" <tjwatson at us.ibm.com>
> Cc: jpms-spec-experts at openjdk.java.net
> Envoyé: Mercredi 26 Octobre 2016 19:24:47
> Objet: Re: Dynamic modules and bidirectional interoperation

> 2016/10/26 9:32:42 -0700, Thomas Watson <tjwatson at us.ibm.com>,
> jpms-spec-comments:
>> 2016/10/26 09:15:45 -0700, mark.reinhold at oracle.com, jpms-spec-experts:
>>> 2016/10/7 8:47:53 -0700, Thomas Watson <tjwatson at us.ibm.com>,
>>> jpms-spec-observers:
>>>> ...
>>>> 
>>>> 1) Any OSGi dependencies that influence class loader delegation will not
>>>> be declared in the ModuleDescriptors which represent the OSGi bundle
>>>> wirings.  Instead we will depend on the ability to
>>>> #ReadabilityAddedByLayerCreator to wire up the modules within the bundle
>>>> Layer according to OSGi resolution rules.  It has a drawback if there are
>>>> cases where some system code is trying to reason about modular
>>>> dependencies by using the JPMS module API.  I think this will have to be
>>>> acceptable because I don't think we will be able to fully converge on all
>>>> the possible dependency types available in the existing module systems.
>>>> For example, OSGi has Require-Bundle which maps closing to JPMS requires,
>>>> but OSGi also has Import-Package dependencies which cannot be mapped
>>>> properly into JMPS module Layers.
>>> 
>>> If by "system code" you mean code in the JDK itself, I don't think this
>>> will be a big problem at run time.  Except for diagnostic purposes,
>>> module descriptors are really only interpreted during resolution and
>>> configuration.  All other run-time reasoning about module readability
>>> is based upon the reads edges in the module graph as reported by the
>>> `java.lang.reflect.Module::canRead` method, and that will include any
>>> reads edges that you add to support bundle wirings.
>> 
>> Here I am using "system code" in the general sense, but I think any
>> "system code" that cares about wiring will need to pay attention to
>> Module::canRead like you suggest.  I can think of a few frameworks that
>> care about how modules are wired up at runtime.  For example, in OSGi we
>> have the extender pattern. Without going into much detail here, basically
>> an extender implementation module will only act on extendee modules which
>> are wired to the extender module.  If such a pattern exists using JPMS
>> then the "system code" would be the extender implementation.
> 
> Okay, I see.
> 
>>>> 2) I assume #NonHierarchicalLayers will be restricted to form a directed
>>>> acyclic graph.
>>> 
>>> Yes.
>>> 
>>>>                 As such I assume each node in the graph of Layers would be
>>>> visited only once when resolving new Layers on top even if there are
>>>> multiple paths to the layer from the new Layer being resolved.
>>> 
>>> Yes.
>> 
>> The motivation for my question was to ask some follow-ons.
>> 
>> Will there will be a specified order in which the nodes are traversed
>> when there are multiple paths to a node?  More specifically will the
>> parents have a specified order in which they are delegated to?
> 
> Yes, the parents of a new configuration will be specified in an ordered
> list and during resolution they'll be searched depth-first, in the order
> in which they occur in the list.  Depth-first order makes it easy to
> reason about resolution, since it works just like a search path.

I fail to seen how this is not a mini-classpath with exactly the same issues as the classpath.

> 
> - Mark

Rémi


More information about the jpms-spec-experts mailing list