Proposal: #NonHierarchicalLayers (+ #LayerPrimitives)

Thomas Watson tjwatson at us.ibm.com
Wed Mar 8 21:22:32 UTC 2017


mark.reinhold at oracle.com wrote on 03/08/2017 02:07:39 PM:
> > No that cannot work without hacks to allow other modules to depend on 
the 
> > unnamed system.bundle module.  The reason is because we have bundles 
today 
> > that make extensive use of org.osgi.framework packages.  These bundles 

> > then also export packages that we want to make available to JPMS 
modules 
> > on top.  These bundles have to be loaded in to a named module in order 
to 
> > allow these JPMS modules to require them.  I think it would be an 
> > unfortunate work around to have to link an edge to an unnamed 
> > system.bundle module from a bundle module in order to get this 
> > functionality to work.
> 
> Okay, so it's possible, but it's unpleasant.

That is one way to put it!

I think I would look for other ways to load the extension bundles into 
JPMS.  For example, perhaps I can place them in a new Layer/Module that is 
separate from the framework system.bundle module but maps to the same 
class loader.  This would deviate from how normal fragments are handled in 
the framework, but I think that would be better than hacking in an unnamed 
module.  Care would need to be taken not to claim the extension module 
contained packages already contained by the system.bundle, but that is 
possible to detect.

> 
> >                         It also implies that it will be more difficult 
in 
> > the future to ship an osgi framework implementation jar as a real 
module 
> > since we must load the implementation of the framework into an unnamed 

> > module to be fully functional with respect to framework extensions.
> 
> More difficult, perhaps, but still possible.  An OSGi framework could be
> embedded in a JPMS module as a JAR-file resource that its launcher, 
which
> is regular code in that JPMS module, loads directly into the unnamed
> module of an appropriate class loader.
> 
> I don't think it's unreasonable for an OSGi/JPMS interoperation solution
> to have to do these things, especially when the alternative is to commit
> the entire Java SE Platform to otherwise-unnecessary complexity for the
> long term.

If it was only for this limited case in the support of OSGi framework 
extensions then I tend to agree.  I am under the impression that others 
have more general usecases for these methods.  I am only giving feedback 
for my usecase to justify the need for the methods.  There may be some 
ways around this for OSGi.  I have to investigate to see how bad or 
difficult it makes life for us.

> 
> > FYI, for the most part I see your points about other solutions are 
> > possible to solve the performance issue with private packages.  I'm 
just 
> > pointing out that it was not a necessary concern before Java 9, so we 
need 
> > to be prepared to react.  The private-package scanning issue may well 
have 
> > to be solved outside of JPMS.  Particularly if the internals of 
addPackage 
> > consider the method to be rarely called (if ever) and therefore there 
is 
> > no need for it to be super fast.  But for supporting system.bundle 
> > fragment attachment the addPackage and addExportToAll methods are 
needed. 
> > The number of calls to these methods to support system.bundle 
fragments 
> > should be small and not as concerned with how speedy they are.  On the 

> > other hand, if addPackage is used to solve the private package 
scanning 
> > issue then addPackage must be exceptionally fast and thread safe.
> 
> All of these low-level methods must be thread-safe in any case, no 
matter
> how often they're used, and that's a big part of the inherent 
complexity.

Understood.

> 
> > Early on in my POC I had the idea of allowing the Layer creation to be 

> > able to map a class loader to a to a default module name.  Basically 
the 
> > reverse of the existing clf function.  Instead of mapping a module 
name to 
> > a class loader this would map a class loader to a default module name. 
Any 
> > package that gets defined in a package that is unknown to the modules 
> > associated with that class loader would get defined as part of the 
default 
> > module instead of the current unnamed module.  Would this be an 
acceptable 
> > solution for addPackage?  We still would need the addExportToAll 
though.
> 
> In implementation terms this would be little different from 
`addPackage`,
> since the JVM would still have to be prepared to add packages to a named
> module at any time.

I figured as much.

> 
> - Mark
> 

Tom




More information about the jpms-spec-observers mailing list