将 JavaFX 应用程序构建到 JAR 文件时如何修复 java.lang.NoClassDefFoundError: javafx/application/Application?

问题描述 投票:0回答:1

我有一个 JavaFX 应用程序,当我在 IntelliJ IDEA 中运行它时工作正常,但是当我尝试将其构建到可执行 JAR 文件中时,我收到此错误:

Exception in thread “main” java.lang.NoClassDefFoundError: javafx/application/Application
 at java.base/java.lang.ClassLoader.defineClass1(Native Method)
 at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1013)
 at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
 at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
 at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
 at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
 at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
 at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
 at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
 at com.example.song_finder_fx.App.main(App.java:5)
Caused by: java.lang.ClassNotFoundException:  javafx.application.Application
 at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
 at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
 at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) … 10 more

我搜索了很多资源,发现这个错误与JavaFX SDK中的一些JAR文件(‘javafx.controls’、‘javafx.fxml’)有关。但我在构建 JAR 文件时已将所有使用的库添加到工件中,包括这两个 JAR 文件。

我正在使用 Java SDK 19、JavaFX 21-ea+24 和 IntelliJ IDEA。

intellij-idea javafx jar
1个回答
0
投票

你必须创建一个胖罐子。

如果您使用 Gradle(而不是 Maven),您可以在我的 GitHub 上查看此示例应用程序:

https://github.com/davidweber411/SimpleJavaFxAppWithoutModules

有一个 Gradle 任务“createCustomFatJar”,它创建完整的可执行 jar。

© www.soinside.com 2019 - 2024. All rights reserved.