gpt4 book ai didi

java - 使用 gradle 和 intellij 为 JavaFX 构建 FatJar,得到 NoClassDefFOundError

转载 作者:行者123 更新时间:2023-12-03 18:20:22 24 4
gpt4 key购买 nike

我使用内置的 Gradle 支持在 IntelliJ (2019.2) 中建立了一个 OpenJDK 12 项目。为了设计我使用 JavaFX 12 的 GUI。我已经关注并阅读了 setup。指导了几次,我在 IDE 中运行程序没有问题,问题是当我尝试构建一个 .jar 文件进行分发时遇到问题。到目前为止,我还没有找到一个有效的解决方案,我已经搜索了很多,几乎把我的头发扯掉了。目前,当我尝试使用 java -jar "jarName".jar 运行我的 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:1016)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:151)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:802)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:700)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:623)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at com.CAM.Starter.main(Starter.java:6)
Caused by: java.lang.ClassNotFoundException: javafx.application.Application
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 10 more

我尝试将我的主类移动到一个不扩展应用程序的单独类,这就是导致上述错误的原因。如果不移动我的 Main 类,我会得到一个不同的错误。

我的 build.gradle 目前看起来像这样:
plugins {
id 'java'
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.8'
}

group 'ClassicAddonManager'
version '0.2'
sourceCompatibility = 11

repositories {
mavenCentral()
}

javafx {
version = "12.0.2"
modules = [ 'javafx.controls', 'javafx.fxml' ]
}

dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
compile 'net.sourceforge.htmlunit:htmlunit:2.13'
compile group: 'com.google.code.gson', name: 'gson', version: '2.7'
compile group: 'net.lingala.zip4j', name: 'zip4j', version: '1.2.4'
}

jar {
manifest {
attributes 'Main-Class': 'com.CAM.Starter'
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}

如果我有我的 main 方法扩展 Application 然后我得到一个错误,指出我的主类无法找到,即使我可以看到它存在于生成的 .jar 文件中。

我要做的就是生成一个没有编程知识的 friend 可以运行的文件。理想情况下,他们无需先安装 Java 即可运行的文件。我知道应该可以做到这一点,但 Gradle 对我来说是新的,所以我不确定这是否是导致所有这些头痛的原因。是否有更简单的部署方式?特别是考虑到这是一个单独的项目?

编辑

我已经尝试过指南的模块化部分。这样做我在尝试构建时有超过 100 个错误。它们都具有以下特点:
javafx.graphicsEmpty reads package org.xml.sax from both xml.apis and java.xml

最佳答案

如果你想使用 Gradle 而不是 shadow 插件来做一个 fat jar,通常你会这样做:

jar {
manifest {
attributes 'Main-Class': 'com.CAM.Starter'
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}
然而,有一个重要的事实: compile已弃用,JavaFX 插件使用 implementationdefault .
因此, configuration.compile可能是空的,或者至少不包含 JavaFX 类。
解决方法是检查 runtimeClasspath配置,因为我们将在那里拥有所有类,我们可以制作 fat jar:
jar {
manifest {
attributes 'Main-Class': 'com.CAM.Starter'
}
from {
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
}
这在 OpenJFX 文档 https://openjfx.io/openjfx-docs/#modular 中有解释。 ,分段非模块化项目,分段gradle。
一旦你有了你的 fat jar ,你可以运行它:
java -jar yourFatJar.jar
注意双击是不行的,详细解释 here ,因此可以方便地改为创建小批量。
更好的解决方案是做一个模块化项目并使用 jlink创建运行时镜像(它还包括启动器脚本)。您可以将此镜像分发给其他甚至没有安装 JDK 的用户。使用 gradle,您可以只包含 'org.beryx.jlink'插件,就像这个 sample .
您也可以使用 early versionjpackage创建和分发安装程序。

关于java - 使用 gradle 和 intellij 为 JavaFX 构建 FatJar,得到 NoClassDefFOundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57452363/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com