当前位置: 首页 > 面试题库 >

使用gradle和intellij为JavaFX构建FatJar,获取NoClassDefFOundError

阎俊英
2023-03-14
问题内容

我已使用内置的Gradle支持在IntelliJ(2019.2)中设置了OpenJDK 12项目。为了设计使用JavaFX
12的GUI,我已经阅读并阅读了多次安装指南,在IDE中运行程序没有问题,问题是当我尝试构建要运行的发行版的.jar文件时陷入问题。到目前为止,我还没有找到一个可行的解决方案,而我搜索了很多QUITE,几乎为此扯掉了头发。当前,当我尝试使用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

我试图将我的主类移至一个不会扩展Application的单独类,这就是产生上述错误的原因。如果不移动我的主班,我会得到一个不同的错误。

我的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) }
    }
}

如果我有扩展Application的主要方法,那么我会收到一条错误消息,指出即使在生成的.jar文件中存在我的主类也找不到。

我要做的就是生成一个文件,不懂编程的朋友可以运行该文件。理想情况下,无需先安装Java就可以运行的文件。我知道应该可以这样做,但是Gradle对我来说是新手,所以我不确定这是否是造成所有头痛的原因。是否有潜在的更简单的部署方法?特别是考虑到这是一个单独的项目?

编辑

我已经尝试了指南的模块化部分。这样做时,尝试构建时出现了100多个错误。它们全都具有以下特点:

javafx.graphicsEmpty reads package org.xml.sax from both xml.apis and java.xml

问题答案:

如果您想使用Gradle而不是Shadow插件来制作胖子,通常您会这样做:

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

然而,有一个重要的事实:compile已被弃用,JavaFX的插件使用implementation的默认。

因此,它configuration.compile可能为空,或者至少不包含JavaFX类。

解决的办法是检查runtimeClasspath配置,因为这里将包含所有类,我们可以制作胖子罐子:

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中进行了说明。

一旦有了胖子罐,就可以使用以下命令运行它:

java -jar yourFatJar.jar

需要注意的是它不会工作,双击,在详细解释在这里,所以它可以方便地创建一个小批量的来代替。

更好的解决方案是执行一个模块化项目,并用于jlink创建运行时映像(它还包含启动脚本)。您可以将此映像分发给甚至没有安装JDK的其他用户。使用gradle,您可以仅包括'org.beryx.jlink'该示例中的插件。

而且你还可以使用早期版本的jpackage创建分发安装程序。



 类似资料:
  • 我试着把我的主类移到一个不扩展Application的单独的类中,这就是导致上述错误的原因。如果不移动我的主类,我会得到一个不同的错误。 My Build.Gradle当前看起来如下所示: 如果我让我的main方法扩展应用程序,那么我会得到一个错误,说明找不到我的main类,尽管我可以看到它存在于生成的.jar文件中。 编辑 我试过指南的模块化部分。这样做,我有超过100个错误时,试图建立。它们都

  • 问题内容: 即使从IntelliJ IDEA内部进行成绩构建,也不会将依赖项放入“外部库”文件夹中,因此这些类不会在编辑器中显示为建议,当我手动将其作为导入添加时,会出现编译错误。 如何使IntelliJ自动将依赖项合并到我的 build.gradle 文件中,例如: 问题答案: 您要么需要从Idea中将项目作为Gradle项目导入。添加依赖项时,需要打开Gradle窗口并执行刷新。 或者使用以下

  • 我试图在Windows上用IntelliJ IDEA Ultimate中的JavaFX运行Gradle项目。JavaFX是在我们最新的Git push中添加的,在它开始工作之前。 JDK 11.0.5(来自Oracle站点,不是openJDK),我使用的是Java11,都在IntelliJ中配置 JDK安装目录(特别是/bin目录)添加到我的路径 JDK安装目录中添加的java_home环境变量

  • 我使用gradle jar命令构建项目,然后尝试使用java-jar myproject.jar命令启动应用程序 我的建筑。加德尔:

  • 问题内容: 我正在尝试使用Gradle构建相对简单的JavaFX应用程序。但是,我不知道该怎么做。 我是Gradle的新手,对于简单的(非javafx)项目,我已经成功使用了插件,并构建和打包了库和命令行应用程序。 但是,关于JavaFX,我完全陷入困境。我已经阅读了这篇文章,该文章建议使用该插件,但是我只能找到该插件的源代码,但是没有关于如何实际使用它的文档(在文章中,他们只是从远程URL应用它

  • 我试图使用Gradle构建一个相对简单的JavaFX应用程序。但是,我完全不知道该怎么做。 我对Gradle比较陌生,对于简单的(非JavaFX)项目,我已经成功地使用了插件和来构建和打包库和命令行应用程序。 然而,当涉及到JavaFX时,我完全被卡住了。我读过这篇文章,其中建议使用插件,但是我只能找到这个插件的源代码,而没有关于如何实际获取它和使用它的文档(在文章中,他们只是从远程URL应用它,