Yes, that is intentional.
So I guess the correct behavior is to find the jars only via the
ModuleFinder,
and use the classloader only for nonmodular jars, is this right?

In the Servlet spec, it is allowed to have split packages, from the
WEB-INF/classes
and WEB-INF/lib/ jars, for instance, so it is not as trivial as running an
application in the command line.
Besides being allowed split packages, the classes in the WEB-INF/classes
must override the same classes in the WEB-INF/lib (something like the
--patch-module)

My current behavior is trying to find the modules using my ModuleFinder
(most of the modules
will be an automatic module) and if it is not allowed for some reason
(invalid package name, invalid services, so on) it fallbacks to the
classloader
to still find all the things correctly.

Unfortunately, I cannot only remove the jars from my classloader and
delegate
to the classloader provided by the ModuleLayer because we use a custom
classloader,
and have some important information stored in it, so by removing the jars
from the classloader
all applications would stop working.

I hope made it a little more clear. By now it is clear that it is loading
the same
resource twice because the same jar is in the classloader and in the module
layer
classloader.


Em dom., 3 de jan. de 2021 às 01:24, Johannes Spangenberg <
johannes.spangenb...@hotmail.de> escreveu:

> Note that you are actually loading the JARs twice which means that you
> might have two versions of the same classses loaded, not only of the
> resources. Is this intentional? I still don't know what you want to
> achieve with your class loader and module layer.
>
> Am 02.01.2021 um 21:06 schrieb Thiago Henrique Hupner:
> > Yes, the parent loader locates two resources and it is used in the
> > defineModulesWithOneLoader.
> >
> > So the behavior is the following:
> > module-a.jar -> META-INF/web-fragment.xml
> > module-b.jar -> META-INF/web-fragment.xml
> >
> > Creating a URLClassloader with these two jars and calling the
> getResources,
> > it returns two URLs.
> >
> > If then I create a module for each jar, the contents of each module will
> be
> > the same as the content
> > found by the URLClassloader.
> > Using that classloader as the parent in the defineModulesWithOneLoader
> > gives the following behavior:
> >
> > Calling getResources with the loader created by the ModuleLayer,
> > it will search the resources in all the modules of that layer (module.a
> and
> > module.b),
> > and then delegate to the parent (URLClassloader), which will find the
> same
> > resources,
> > thus, doubling the results.
> >
> > Now describing it make clear to me that is something not easy to fix,
> > so by now, I worked around it by creating a ModuleReader that only
> > find the ".class" files in the module and the other resources will be
> > available by the parent,
> > however, I don't know if this solution is the best.
> >
> >
> > Em sáb., 2 de jan. de 2021 às 14:51, Alan Bateman <
> alan.bate...@oracle.com>
> > escreveu:
> >
> >> On 02/01/2021 12:59, Thiago Henrique Hupner wrote:
> >>> I guess a little context can make more things clear:
> >>> The servlet spec requires that all jars from WEB-INF/lib
> >>> be available to the same classloader.
> >>> The resource, in particular, is "META-INF/web-fragment.xml"
> >>> Each jar can contain its own. So, using getResources make sense
> >>> in order of parsing each. However, what is happening is if I have two
> >> JARs
> >>> each with its own META-INF/web-fragment.xml, using the ModuleReader
> >>> it is returning four resources, so it parses more than it should and
> >>> it fails
> >>> to parse the same resource twice.
> >>>
> >> Which parent class loader are you specifying to
> >> defineModulesWithOneLoader? It it possible that it locates the resource
> >> in the two JAR files?
> >>
> >> -Alan
> >>
>

Reply via email to