java.lang.NoClassDefFoundError:javafx/application/Application

java.lang.NoClassDefFoundError:javafx/application/Application

我按照说明安装了 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 进行了测试。

相关内容