首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.lang.NoClassDefFoundError: javafx/application/Application

java.lang.NoClassDefFoundError: javafx/application/Application
EN

Ask Ubuntu用户
提问于 2019-04-23 15:07:44
回答 3查看 106.5K关注 0票数 21

我按照描述的这里安装了OpenJDK-11。我运行了sudo apt install openjfx

我的java版本:

代码语言:javascript
复制
$ 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类。

EN

回答 3

Ask Ubuntu用户

发布于 2019-04-26 21:40:30

Java不再与Java运行时一起打包。您必须下载并使用JavaFX运行时打包Jar,请参阅https://openjfx.io/openjfx-docs/,以了解如何最好地启动和运行Jar。

票数 3
EN

Ask Ubuntu用户

发布于 2020-04-03 13:20:53

我建议您使用https://openjfx.io/openjfx-docs/ .i am使用Eclipse,但它适用于所有.i

然后,在将VM选项设置为:

在IDE中右击项目->运行作为->运行配置->参数->VM参数

对于Windows,

代码语言:javascript
复制
--module-path "\path to javafx\lib" --add-modules javafx.controls,javafx.fxml

对于Linux来说,

代码语言:javascript
复制
--module-path /path to javafx/lib --add-modules javafx.controls,javafx.fxml
票数 2
EN

Ask Ubuntu用户

发布于 2022-08-14 08:03:59

您可能会遇到这个问题,因为您试图通过命令行从Kotlin运行JavaFX。由于Kotlin使用它自己的URLClassLoader作为父级,它没有由底层JVM的系统类加载器填充,所以在底层JVM中存在JavaFX (例如,因为JVM是包含JavaFX的JavaFX是Azul Zulu 18 )时,将不会发现JavaFX类,但在类路径上不会显式地发现。

解决方法是使用与Kotlin的URLClassLoader相同的URL创建自己的ClassLoader,使用JVM的系统类加载器作为父级,然后通过反射使用。

下面是一个示例,说明如何使用附加的main()方法来实现这一点。

代码语言:javascript
复制
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)
}

我在Kubuntu22.04上用Kotlin 1.7.10和Azul Zulu 18.0.2.fx测试了这一点。

票数 0
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1136420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档