Arch Linux

Please read this before reporting a bug:
https://wiki.archlinux.org/title/Bug_reporting_guidelines

Do NOT report bugs when a package is just outdated, or it is in the AUR. Use the 'flag out of date' link on the package page, or the Mailing List.

REPEAT: Do NOT report bugs for outdated packages!
Tasklist

FS#71510 - [java-openjfx] cannot be used by following the official documentation

Attached to Project: Arch Linux
Opened by ibbem (ibbem) - Wednesday, 14 July 2021, 20:37 GMT
Last edited by Andreas Radke (AndyRTR) - Saturday, 17 July 2021, 16:36 GMT
Task Type Bug Report
Category Packages: Extra
Status Assigned
Assigned To Felix Yan (felixonmars)
Levente Polyak (anthraxx)
Architecture All
Severity Medium
Priority Normal
Reported Version
Due in Version Undecided
Due Date Undecided
Percent Complete 0%
Votes 0
Private No

Details

Description:
The official JavaFX documentation
https://openjfx.io/openjfx-docs/
explains, that java needs the --module-path option to find the required modules for JavaFX.
But when using this option like this
$ java --module-path /usr/lib/jvm/java-16-openjdk/lib
the process exits with exit code 1 and prints the following error message:

Error occurred during initialization of boot layer
java.lang.LayerInstantiationException: Package jdk.internal.jimage.decompressor in both module java.base and module jrt.fs

When executing this command it doesn't matter whether java receives more options like the full command line given in the documentation:
$ java --module-path /usr/lib/jvm/java-16-openjdk/lib --add-modules javafx.controls HelloFX

I played a little bit with this and got it working by putting all JavaFX related files (except the licences of course) of the java-openjfx package into a separate folder like this:
$ mkdir /tmp/javafx
$ ln -s $(pacman -Ql java-openjfx | grep /usr/lib/jvm/java-16-openjdk/lib | tail +2) /tmp/javafx
$ java --module-path /tmp/javafx --add-modules javafx.controls HelloFX

Therefore I hypothesize that some file in that directory conflicts with some standard module.
I queried all the packages which installed files into that directory by executing
$ find /usr/lib/jvm/java-16-openjdk/lib -maxdepth 1 | xargs pacman -Qo | sed 's/.*owned by //' | cut -d ' ' -f 1 | sort | uniq
and got the following result:
java-openjfx
jdk-openjdk
jre-openjdk
jre-openjdk-headless

Note: The offending file jrt.fs in the error message above is owned by jre-openjdk-headless which is a transitive dependency of java-openjfx.

Looking at the git log of the asp repository of java-openjfx, it seems like this directory structure is used since Java 11 is supported by javafx (git commit hash: 85bd803bbe46f37bb0a8a6d82316d3742ff26f15).
I did not yet verify if java-openjfx worked before this release, because I guess this change was due to the introduction of modules to java (and javafx).

If the java-openjfx package is intended to be used some other way, this is probably not a bug, but it should be documented in the arch wiki.
This could be done in a new wiki page for JavaFX or by adding to the existing paragraph in the
https://wiki.archlinux.org/title/Java
wiki page.

Hint: I think this bug was already reported by Mike (teacher4711) in  FS#65191 , but it was closed due to inactivity.

Package versions:
- java-openjfx 16.u8-1
- jdk-openjdk 16.0.1.u9-1
- jre-openjdk 16.0.1.u9-1
- jre-openjdk-headless 16.0.1.u9-1

Steps to reproduce:
# pacman -S jre-openjdk java-openjfx
$ java --module-path /usr/lib/jvm/java-16-openjdk/lib
This task depends upon

Loading...