ArchLinux中HMCL启动器提示缺少JavaFX的解决方法

问题描述

在Arch Linux系统中已经安装了以下默认版本的软件包:

  • java-openjfx
  • jdk-openjdk
  • jre-openjdk
  • jre-openjdk-headless

运行HMCL的时候会提示找不到JavaFX:

1
2
3
4
[org.jackhuang.hmcl.util.SelfDependencyPatcher.patch/INFO] Missing JavaFX dependencies, attempting to patch in missing classes
[org.jackhuang.hmcl.util.SelfDependencyPatcher.loadFromCache/INFO] - Loading dependencies...
[org.jackhuang.hmcl.util.SelfDependencyPatcher.patch/INFO] - Done!

HMCL是一个很好用的minecraft启动器,它能够自动到网络上下载所需的依赖,但是系统本身已经安装了所需依赖,为什么不用呢?

据了解,JavaFX不再是OpenJDK的一部分了,因此用默认的OpenJDK运行jar会出现找不到JavaFX模块的问题。

解决的方法是手动添加JavaFX模块。由于某种未知的原因,Arch Linux中,java-openjfx包会将JavaFX库安装到OpenJDK的lib目录中,导致以下添加方式出现错误

1
2
3
$ java --module-path /usr/lib/jvm/java-20-openjdk/lib   --add-modules javafx.base,javafx.controls,javafx.fxml,javafx.graphics,javafx.media,javafx.swing,javafx.web -jar HMCL-3.5.5.jar
Error occurred during initialization of boot layer
java.lang.LayerInstantiationException: Package jdk.internal.jrtfs in both module java.base and module jrt.fs

这是因为,在顶级目录中不包含module-info.class的jar文件被视为自动模块自动加载,jrt.fs包含编译为JDK 8的“jrt”文件系统提供程序的副本,最终结果是出现两个包含jdk.internal.jrtfs包(以及许多其他包)的冲突模块。解决冲突的方法是更加详细地描述添加模块的路径信息。

解决方法

1
2
3
4
#!/usr/bin/sh
export PATH_TO_FX=/usr/lib/jvm/java-20-openjdk/lib

java --module-path $PATH_TO_FX/javafx.base.jar:$PATH_TO_FX/javafx.controls.jar:$PATH_TO_FX/javafx.fxml.jar:$PATH_TO_FX/javafx.graphics.jar:$PATH_TO_FX/javafx.media.jar:$PATH_TO_FX/javafx.swing.jar:$PATH_TO_FX/javafx.web.jar:$PATH_TO_FX/javafx-swt.jar --add-modules ALL-MODULE-PATH -jar HMCL-3.5.5.jar