Why not multiple modules of the same name in a class loader?
David M. Lloyd
david.lloyd at redhat.com
Fri May 12 19:40:38 UTC 2017
On 05/12/2017 02:09 PM, David M. Lloyd wrote:
> On 05/12/2017 01:46 PM, Remi Forax wrote:
>>
>>
>> On May 12, 2017 8:08:38 PM GMT+02:00, "David M. Lloyd"
>> <david.lloyd at redhat.com> wrote:
>>> This has come up a couple times now and I'm not sure why the rule
>>> exists: why not allow multiple modules with the same name in the same
>>> class loader?
>>
>> module names appear in the stack traces, it will make life of people
>> miserable if they have to open several artifacts to find the good one.
>
> I agree; but, I wasn't looking for moral reasons, I was just curious
> about the technical constraint (if it even exists; maybe it does not!).
>
>>> As far as I can tell, there is no way to locate a module by class
>>> loader, and module namespaces are generally already well-governed by
>>> their layer, so from an API perspective at least, it seems like this is
>>>
>>> a harmless scenario (as long as there are no package conflicts,
>>> obviously, but a container generally is able to manage this concern).
>>>
>>> Preventing this does block one potential workaround for the lack of a
>>> ModuleLayer.Controller.addPackage() method, which would be to
>>> supplement
>>> a module's content at run time by defining a new Layer that contains a
>>> module of the same name as the original content within the same class
>>> loader, where the container would then take care of such details as
>>> mutual read/opening and cyclic access.
>>>
>>> So that made me curious: is there some hotspot-internal dictionary that
>>>
>>> I missed, which manages the set of modules within a class loader?
>>
>> take a look to defineModule :)
>
> I assume you mean Module.defineModule0 -> JVM_DefineModule ->
> Modules::define_module, which is where I looked. It seemed to care
> about the class loader of the module, and about package names, but
> unless I'm just being blind to this (always a possibility), I don't see
> anyplace where it cares about what modules are defined to the class
> loader. The closest thing I see is the bootstrap code which reads from
> the jimage, but none of that applies to user ModuleLayers.
>
> In other words, I find no Map<String, Module>, or its C++ equivalent, at
> any level in a class loader that would be capable of such enforcement,
> let alone require it.
>
> I guess I should do some more testing & tracing to see how this part
> works; maybe it's actually allowed!
Found it: there's a module table on ClassLoaderData that you get via its
modules() method.
--
- DML
More information about the jigsaw-dev
mailing list