The trick is that now I'm using my classloader
to load the modules, I need to override the ClassLoader#findClass(String
module, String className)
So the service loader finds the classes successfully.

Em seg., 4 de jan. de 2021 às 10:51, Thiago Henrique Hupner <
thi...@gmail.com> escreveu:

> Looks like the ModuleLayer.defineModules is the thing I needed.
> With it, I can use my current classloader to load all the modules
> and it can find the classes from both module and unnamed module.
>
> However, I'm having some trouble with the ServiceLoader now,
> In the configuration, I've called resourceAndBind, but I'm getting
> "Provider foo.bar not found"
>
> There is some trick to get a class from an upper layer to bind to the
> a class in the boot layer?
>
> Thanks!
>
> Em seg., 4 de jan. de 2021 às 09:41, Johannes Spangenberg <
> johannes.spangenb...@hotmail.de> escreveu:
>
>> The bidirectional delegation is an important point. Beside that, you
>> also mentioned that your custom class loader stores additional
>> information.
>>
>> > 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.
>>
>> If you really need this information as part of the class loader, I fear
>> you need to create custom class loaders for your modules together with
>> ModuleLayer.defineModules [1] instead of
>> ModuleLayer.defineModulesWithOneLoader. The class loader for
>> ModuleLayer.defineModulesWithOneLoader is not public. I guess you would
>> need to reimplement it. Maybe you can find other locations to store the
>> information.
>>
>> [1]
>>
>> https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/lang/ModuleLayer.html#defineModules(java.lang.module.Configuration,java.util.List,java.util.function.Function)
>>
>> Am 04.01.2021 um 12:38 schrieb Thiago Henrique Hupner:
>> > Yes, that's exactly it. Sorry for all the noise in the previous emails.
>> >
>> > I'm not using a URLClassLoader in my application, I've only used it
>> > as an example because it is very easy to override to return a specific
>> > value (and not have to implement all the other methods).
>> >
>> > So, I guess I will need to have a look at the application classloader
>> > and update my current classloader to be able to do the bidirectional
>> > delegation. Do you have any recommendations about where to look?
>> >
>> > Thanks!
>> >
>> > Em seg., 4 de jan. de 2021 às 05:48, Alan Bateman <
>> alan.bate...@oracle.com>
>> > escreveu:
>> >
>> >> On 03/01/2021 13:10, Thiago Henrique Hupner wrote:
>> >>> :
>> >>>
>> >>> 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.
>> >> If I read your mail correctly you've got a class path today and you
>> want
>> >> to "move" the well behaved components to a module path, leaving the
>> >> remaining the components that can't work as automatic modules on the
>> >> class path. It's equivalent to specifying both a module path and class
>> >> path to the java command line launcher. You also mention that you have
>> >> to use a custom class loader. If that class loader were updated to
>> >> support modules and load classes into its unnamed module then you
>> should
>> >> be able to get this to work. This is very advanced territory and would
>> >> be approximately equivalent to the application class loader in the JDK
>> >> where it supports both modules and the class path. I don't think your
>> >> current approach of using a URLClassLoader as a parent will work as it
>> >> doesn't support the bidirectional delegation that would be need to get
>> >> this to work.
>> >>
>> >> -Alan.
>> >>
>>
>

Reply via email to