How to export a package from a module in a boot layer to module in a child layer.
Alex Buckley
alex.buckley at oracle.com
Fri Jan 31 18:24:59 UTC 2025
It seems the JLine maintainers were concerned about depending on the
internals of a separate project (jansi), because "to minimize the
maintenance cost, Jansi has been merged into JLine 3.25."
(https://github.com/jline/jline3).
That's a good step because it saves people who are not maintainers of
JLine from trying to make it work by messing with the internals of a
standalone jansi JAR.
Even better, JLine 3.24 started using its own providers to access the
Windows API, rather than go through its bundled version of jansi. This
means that on modern JDKs, JLine can use the FFM API to make native
Windows calls. I expect that the performance and maintainability of this
approach is light years ahead of the old clunky route through
jansi.internal.Kernel32.
It's hard to see why anyone using JLine 3.28 (per the errors below)
would want to use an external version of jansi when the JLine
maintainers have done such great work to ensure no-one has to worry
about jansi.
Alex
On 1/31/2025 5:18 AM, Code Ranger wrote:
> Hello all.
>
> I have a boot layer with `org.fusesource.jansi` module a child layer
> with jline3 module. Jline3 wants to use jansi:
>
> Caused by: java.lang.IllegalAccessError: class
> org.jline.terminal.impl.jansi.JansiTerminalProvider (in module
> org.jline) cannot access class org.fusesource.jansi.internal.Kernel32
> (in module org.fusesource.jansi) because module org.fusesource.jansi
> does not export org.fusesource.jansi.internal to module org.jline
> at org.jline at 3.28.0/
> org.jline.terminal.impl.jansi.JansiTerminalProvider.verifyAtLeast(JansiTerminalProvider.java:85) ~[jline-3.28.0.jar:?]
> at org.jline at 3.28.0/
> org.jline.terminal.impl.jansi.JansiTerminalProvider.<init>(JansiTerminalProvider.java:93) ~[jline-3.28.0.jar:?]
> at java.base/
> jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62) ~[?:?]
> at java.base/
> java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502) ~[?:?]
> at java.base/
> java.lang.reflect.Constructor.newInstance(Constructor.java:486) ~[?:?]
> at org.jline at 3.28.0/
> org.jline.terminal.spi.TerminalProvider.load(TerminalProvider.java:69)
> ~[jline-3.28.0.jar:?]
>
> If I do
> --add-exports org.fusesource.jansi/
> org.fusesource.jansi.internal=org.jline \
>
> I get WARNING: Unknown module: org.jline specified to --add-exports
> (as I was already told if a module is not the boot layer it is just
> ignored)
>
> if I do
> --add-exports org.fusesource.jansi/
> org.fusesource.jansi.internal=ALL-UNNAMED \
>
> I get the same exception.
>
> Could anyone say how to fix it?
>
> Best regards, CR
>
More information about the jigsaw-dev
mailing list