【发布时间】:2022-01-07 12:36:03
【问题描述】:
被这个问题困扰了好几天。我正在尝试使用 gradle build 命令导出 jar 文件,但它提供了一个小 jar 文件。当我运行 jar 文件时,它给出了以下错误,表明构建中不包含 javafx 依赖项:
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:1012)
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:520)
at newcare.home.Main_1.main(Main_1.java:6)
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:520)
... 10 more
我看过像Creating a Java Gradle project and building the .jar file in IntelliJ IDEA - How to? 这样的帖子,他们似乎帮助了别人,但对我没有帮助。这是我的 build.gradle:
plugins {
id 'java'
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.8'
}
group 'newcare'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
sourceCompatibility = 1.8
dependencies {
testImplementation group: 'junit', name: 'junit', version: '4.12'
implementation group: 'org.jasypt', name: 'jasypt', version: '1.9.2'
implementation 'com.google.code.gson:gson:2.8.7'
implementation 'joda-time:joda-time:2.10.13'
implementation 'org.ocpsoft.prettytime:prettytime:4.0.4.Final'
// here starts JavaFX
implementation 'org.openjfx:javafx:14'
implementation 'org.openjfx:javafx-base:14'
implementation 'org.openjfx:javafx-graphics:14'
implementation 'org.openjfx:javafx-controls:14'
implementation 'org.openjfx:javafx-fxml:14'
implementation 'org.openjfx:javafx-swing:14'
implementation 'org.openjfx:javafx-media:14'
implementation 'org.openjfx:javafx-web:14'
}
javafx{
modules = ['javafx.controls', 'javafx.fxml', 'javafx.media', 'javafx.graphics']
version = '11.0.2'
}
mainClassName = 'newcare.home.Main_1'
jar {
from {
configurations.runtime.collect {
it.isDirectory() ? it : zipTree(it)
}
configurations.compile.collect {
it.isDirectory() ? it : zipTree(it)
}
}
manifest {
attributes "Main-Class": "$mainClassName"
}
exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA'
}
sourceSets {
main {
resources {
srcDirs = ["src/main/java"]
includes = ["**/*.fxml","**/*.css","**/*.png","**/*.jpg"]
}
}
}
我也尝试使用构建工件方法,但似乎没有任何效果。
【问题讨论】:
-
我不知道 gradle,但是这个问题的 maven 等价物是:Maven Shade JavaFX runtime components are missing
-
使用 Gradle Shadow 插件(我想这就是它的名字)。此外,如果您使用的是 JavaFX 插件,那么您不应该手动将 JavaFX 添加到
dependencies(您可以使用javafx扩展来声明您想要的模块和版本;有关详细信息,请参阅文档)。当版本 17.0.1 是最新版本时,为什么要使用 JavaFX 14?请注意,JavaFX 插件的最新版本是 0.0.10。 -
谢谢。我会接受建议并回复你们
-
这是一个不同的解决方案,但是,当您使用 gradle 时,我建议您调查 badass runtime plugin 和 badass jlink plugin,目标是创建适当的运行时映像,而不是像一个不受支持的配置带有依赖项的 jar。