我按照说明安装了 OpenJDK-11这里我跑了sudo apt install openjfx
我的Java版本:
$ java -version
openjdk version "11.0.3" 2019-04-16
OpenJDK Runtime Environment (build 11.0.3+7-Ubuntu-1ubuntu1)
OpenJDK 64-Bit Server VM (build 11.0.3+7-Ubuntu-1ubuntu1, mixed mode, sharing)
但我仍然得到ava.lang.NoClassDefFoundError: javafx/application/Application
这样的信息:jre 无法找到 FX 类。
答案1
您收到此错误是因为您的运行时 PATHjavafx
可能不正确或缺失。
请按照以下步骤操作:
检查 JavaFX 的路径。(例如/usr/share/openjfx/lib/
:)
然后运行命令:
java --module-path $FX-PATH --add-modules javafx.controls -jar sample.jar
其中$FX-PATH
应该设置或替换为提到的 JavaFX 路径。
如果需要添加更多模块,可以在--add-modules
参数中指定。
(--add-modules javafx.controls,javafx.fxml
)
答案2
Java FX 不再与 Java 运行时一起打包。您必须下载并将 Jar 与 JavaFX 运行时一起打包,请参阅https://openjfx.io/openjfx-docs/以便了解如何最好地启动和运行它。
答案3
我建议你选择https://openjfx.io/openjfx-docs/我正在使用 Eclipse IDE,但它适用于所有 IDE
然后,您可以在设置 VM 选项时引用此全局变量,如下所示:
在 IDE 中右键单击项目->运行身份->运行配置->参数->VM 参数
对于 Windows,
--module-path "\path to javafx\lib" --add-modules javafx.controls,javafx.fxml
对于 Linux,
--module-path /path to javafx/lib --add-modules javafx.controls,javafx.fxml
答案4
您可能会遇到此问题,因为您尝试通过命令行从 Kotlin 运行 JavaFX。由于 Kotlin 使用自己的 URLClassLoader,而底层 JVM 的系统类加载器并未将其作为父类加载器填充,因此当 JavaFX 隐式存在于底层 JVM 中(例如,因为 JVM 是包含 JavaFX 的 Azul Zulu 18)时,将无法找到 JavaFX 类,但 JavaFX 类在类路径中不是显式的。
解决方法是创建自己的 URLClassLoader,其 URL 与 Kotlin 的 ClassLoader 相同,使用 JVM 的系统类加载器作为父级,然后通过反射使用它。
下面是如何使用附加方法实现此目的的示例main()
。
import java.net.URLClassLoader
import javafx.application.Application
import javafx.event.*
import javafx.scene.*
import javafx.scene.control.*
import javafx.scene.layout.*
import javafx.stage.*
class Hello : Application() {
override fun start(primaryStage: Stage) {
primaryStage.setTitle("Hello")
val label = Label()
label.setText("Hello, world!")
val root = StackPane()
root.getChildren().add(label)
primaryStage.setScene(Scene(root))
primaryStage.show()
}
companion object {
@JvmStatic
fun main(vararg args: String) {
launch(Hello::class.java, *args)
}
}
}
fun main(vararg args: String) {
class Foo
URLClassLoader((Foo::class.java.getClassLoader() as URLClassLoader).getURLs(), ClassLoader.getSystemClassLoader())
.loadClass("Hello")
.getMethod("main", Array<String>::class.java)
.invoke(null, args)
}
我已经在 Kubuntu 22.04 上使用 Kotlin 1.7.10 和 Azul Zulu 18.0.2.fx 进行了测试。