我有一个 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。
你必须创建一个胖罐子。
如果您使用 Gradle(而不是 Maven),您可以在我的 GitHub 上查看此示例应用程序:
https://github.com/davidweber411/SimpleJavaFxAppWithoutModules
有一个 Gradle 任务“createCustomFatJar”,它创建完整的可执行 jar。