On 10/13/2015 10:59 AM, Nicolai Parlog wrote:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

  Hi Alan.

Can you paste in the code that creates the ModuleClassLoader for
the second Layer? I'm curious to see if you have used the 2-arg
constructor to specify the first as the parent.
The code was the same for both:

        ClassLoader loader =
                        new ModuleClassLoader(configuration);

After your mail I changed it for the second layer so it uses the first
layer's ModuleClassLoader. Now everything works like a charm. Thx!

Follow up question: In this case I constructed the first layer myself
and only used one class loader for it, which I hence had readily
available to pass to the second layer.

What happens if this is not the case? I know about 'Layer.findLoader'
but how would I choose a loader for the second layer? E.g. if I used
several loaders or the first layer or did not even create it myself
and have no idea which and how many loaders it contains.

I don't know for sure, but I see a Layer as a combination of 2 aspects that have to be soundly aligned:

- readability graph of modules
- delegation of class-loaders

For example, say you have a layer with 2 modules: moda & modb and two ClassLoaders loadera & loaderb.

If loaderb is a child of loadera and moda is loaded by loadera while modb is loaded by loaderb, then the following reads edge is possible:

- modb reads moda

but the following is not:

- moda reads modb


So to answer your question, on which loader in a parent layer to base the child class-loader in a child layer. The one that can (by delegation and by itself) load classes in modules that modules in child layer loaded by child class loader depend on.

For example. You could choose extension class-loader as the parent of your child loader in the child of boot layer, but then modules loaded by child loader would not be able to depend on modules loaded by system class loader (the app class loader).

So when you attach a child layer to a parent layer, you have to know something about the structure of class loaders in the parent layer and which modules are loaded by which of them. If parent layer is a simple delegation chain of loaders (not a tree with multiple branches), then the safest loader to choose as the parent is the single "leaf" loader. If the tree in parent layer has multiple branches, you might need to extend those branches to the child layer using separate "peer" loaders in the child layer, but of course, modules in separate loader delegation branches can then not depend on each other although they are all in the same layer.

Have I got the picture right?

Regards, Peter


The beforeFinder is for overriding a module with a different
version. It sounds like you have ended up trying to override the
modules in the boot layer and you probably don't want to do that.
That makes sense, thanks.

  so long ... Nicolai



On 12.10.2015 23:24, Alan Bateman wrote:

On 12/10/2015 21:44, Nicolai Parlog wrote:
:

For the first layer 'parentLayer' is 'Layer.boot()', for the
second it's the first.
Can you paste in the code that creates the ModuleClassLoader for
the second Layer? I'm curious to see if you have used the 2-arg
constructor to specify the first as the parent.

Then I add a read edge from the module that runs all this to the
one in the second layer that contains the code I actually want to
execute. Finally I access the code I actually want to run (in the
second layer) and invoke it. I then get a NoClassDefFoundError
for a class that is present in the first layer.

I tried adapting the 'parentLayer' to be used as the
'beforeFinder' in 'Configuration.resolve' instead of
'ModuleFinder.empty()' but that gave me a
'LayerInstantiationException' ("Module java.base is already
defined").
The beforeFinder is for overriding a module with a different
version. It sounds like you have ended up trying to override the
modules in the boot layer and you probably don't want to do that.

-Alan.

- --
PGP Key:
     http://keys.gnupg.net/pks/lookup?op=vindex&search=0xCA3BAD2E9CCCD509

Web:
     http://codefx.org
         a blog about software development
     http://do-foss.de
         Free and Open Source Software for the City of Dortmund

Twitter:
     https://twitter.com/nipafx

Diaspora:
     n...@pod.geraspora.de
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2

iQIcBAEBCAAGBQJWHMfUAAoJEMo7rS6czNUJ0Z8QAJkl/y86G7mUj6cSnruuFmIl
54bME/aAWN5ljpQW6/Zexdy7CgRtSOipQBo2uxYUzO56mU17l7b+sigBtDTj7h/3
i1I4e6cyubKWTWWZ3tJFltRJJXEnz5v5Ey15v7mopepm9v0dsP3HDjDHzTJSpOmX
BvHIdUSS7qmqU+U3IePPI51sTPGv/JjgC/chYxCZgZ1Nzl6j+Rp4vuUSRbzAbNg6
jyVNId8MRr32LRumgmcdQhOe6unrzNLaqElu89CyKkx/M885T2xaYpLTlqIPxAEV
dFRzvVGcM/vKX/iuqG42yUyqkI133T4YFp1yZxTjT3/9HajJ6uepFPR5UaILIawY
/VTg1n1ibawxzv2Lv0CEc/qq9qGJmEDe+wIDmYLfNhgNn9ZmNMrHEuFGjCp/DxBE
lBhtPu4/3/aNvAxWPAUTn0pxGCBsefZOz8EoeJJTwvwick8TuuN+DS7YBUucwoCZ
Cq8i8wJS/ygwIzQy3TzBd/CKfnn4r8AHc/Iabg3vYtwB4rxBniafXsSXjdk2Uot+
ycis3qNrv5dFi8YPBqM29mKQdHbstYOr0EPGIMBdyPDDfG+nX9qZ5uN4411xsQf7
4bzfEUvz5sCcorE28dV63e+QVsNyPQ6mjya8dPULJhRY61A3TQXZRUuGmd+9YVFM
FnGcuzoCyR95qj4NQt7p
=K4+T
-----END PGP SIGNATURE-----


Reply via email to