How to open a package from a module in the boot layer to a module in another layer?
Alex Buckley
alex.buckley at oracle.com
Mon Jan 13 20:51:43 UTC 2025
Mike/Code Ranger, the obvious suggestion is to put your application
(including the "CORE module") in its own layer, rather than the boot layer.
Alex
On 1/13/2025 1:46 AM, Code Ranger wrote:
> Hello, Alan
>
> Thank you for your suggestions, help, and time. I truly appreciate and
> am deeply grateful for them.
>
> However, I’m afraid I failed to convey the most crucial point.
> Therefore, I decided to illustrate it graphically. I believe everything
> will become clear now.
>
> Please, see https://ibb.co/bLTzp0n
>
> If you have any questions, I’m ready to answer them, as I’ve already
> mentioned, this matter is extremely important to me.
>
>
> On 1/13/25 09:54, Alan Bateman wrote:
>> On 12/01/2025 09:12, Code Ranger wrote:
>>> 1. I see that JDK-8347283 was closed with your comment. I don't
>>> agree with you decision, but I can be wrong. Let me explain, why I
>>> think that is wrong using this concrete example.
>>>
>>> Boot layer has jdk modules and main application modules. The CORE
>>> module of the application creates plugins with child layers. No one
>>> in the world can know what plugins will be created and used when the
>>> main application starts. Now, somewhere in the future, the module A
>>> from plugin X will require module B from boot layer to open its
>>> package to module A. I believe, that the only solution to do it is to
>>> provide the controller of the boot layer.
>>>
>>> 2. Now, I tried to do apiModule.addOpens in CORE module. I got:
>>>
>>> java.lang.IllegalCallerException: com.foo.api.packagename is not open
>>> to module com.foo.core
>>> at java.base/java.lang.Module.addOpens(Module.java:918) ~[?:?]
>>>
>>>
>>> Therefore, as far as I understand, for the solution you are
>>> suggesting to work, the packagename package of the API module must be
>>> opened to the Core module. But the main problem, as I've said above -
>>> no one knows in advance which packages of which modules from the boot
>>> layer will need to be opened/exported, etc., to the plugins that will
>>> be created by users and deployed dynamically.
>>
>> Your second mail reveals a bit more but it's not clear if your issue
>> is one of these scenarios:
>>
>> 1. A serialization library that is incompatible with strong
>> encapsulation. If so, that's a different discussion.
>>
>> 2. The API and CORE modules have some interesting internals that the
>> authors of these modules have chosen not to export. The author of a
>> plugin doesn't agree. As you've found, this can only be facilitated
>> with cooperation from code in CORE. It may additionally require CLI
>> option if API won't open its packages to CORE. This means running with
>> --add-opens API/com.foo.api=CORE so that CORE can open API's package
>> to the plugin module in the child layer.
>>
>> 3. A badly behaved plugin that depends on the internals of standard or
>> JDK modules. This would be whack-a-mole and require a combination of
>> CLI options and code in CORE to open java.* and jdk.* packages to the
>> offending code in the plugin.
>>
>> -Alan
>>
>>
>
More information about the jigsaw-dev
mailing list