Proposed enhancement to Layer API

Thomas Watson tjwatson at us.ibm.com
Wed Jan 4 15:15:33 UTC 2017


> In some cases we have the full contents, but in other cases we allow 
> dynamic deployment contents to be updated or added at run time (mostly 
> for development purposes but it can be practical and useful to add 
> contents at run time as well in certain cases).  Because of the way that 

> our linkage algorithm is designed, our current Jigsaw integration 
> prototype just adds all contents after the fact (mainly because of the 
> dependency chain involved in building our modules, in which the contents 

> simply aren't available at the time we establish the class loader and 
> layer).
> 
> It is theoretically possible to rewrite our linkage algorithm to use the 

> first known set of packages as the static package set for a module, but 
> we'd still need the ability to add contents anyway, or else drop the 
> feature entirely, which would be unfortunate.
> 
> -- 
> - DML
> 

In OSGi we also have this ability (known as fragments).  In my JPMS-OSGi 
integration POC I modelled a host module and all of its attached fragments 
as a single JPMS module.  I did this because in OSGi the host content and 
all of its attached fragment content are loaded with a single class loader 
and fragments are able to deliver additional classes to packages already 
contained in the host module.  With JPMS I can not map a single class 
loader to multiple modules which contain the same package, so I opted to 
model fragments as being part of the host module.  Fragments are also able 
to deliver classes in packages that are previously unknown to the host 
(module).

In theory fragments can be dynamically attached to an already resolved 
host (module) which implies that we need to be able to dynamically add 
packages to the existing host module.  With that in mind, if we wanted to 
support dynamic attachment of fragments then the ability to add packages 
would also be useful to me.

An alternative approach would be to map the host module class loader to 
fragment modules as well as the host module but only have the fragment 
declare packages that are not already declared by the host module.  This 
would require that each fragment is contained in its own isolated layer so 
that we can dynamically map the original host class loader to newly 
attached fragment modules.  But this complicates things in many ways.  For 
example, requiring a module grants a module access to all packages 
exported by the required module.  Fragments are allowed to export 
additional packages.  Allowing the set of exports to be dynamically added 
to an already in use module may break to rules for configurations that are 
built on top of the layers containing the host modules.  I'm unsure what 
methods like addExportsToAll should do for existing modules that are 
already resolved (linked?) against the module you are adding an export to? 
 Does it dynamically grant access to the exported package at runtime? What 
if that introduces a split package to the requiring module?

So far I have decided to simply not support dynamic attachment of 
fragments that contain new packages for the JPMS-OSGi integration. Instead 
the host module must be re-resolved so that the new fragment content can 
be properly merged into the host module in JPMS.  This simplifies things 
but comes at the cost of not properly supporting dynamic attachment of 
fragments that deliver new packages.

Tom




More information about the jigsaw-dev mailing list