当前位置: 首页 > 知识库问答 >
问题:

JavaFX打包:NoClassDefFoundError

邹铭
2023-03-14

我使用maven和OpenJDK 1.8(pom中的相关部分)打包了一个JavaFX应用程序。xml:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <mainClass>ui.Main</mainClass>
            </manifest>
        </archive>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
</plugin>

现在重要的是,这曾经有效。我知道这一点,因为我专门在打包最终起作用的地方进行了git提交。经过一天左右的时间和像这样的多次构建(我不知道发生了什么变化),我无法再启动jar,因为以下错误:

$ java -jar target/app.jar
Error: Could not find or load main class ui.Main Caused by:
java.lang.NoClassDefFoundError: javafx/application/Application

当我查看Jar的内容时,我可以看到,除了JavaFX类之外,所有依赖项都被专门包括在内。

我所尝试的:

  • 使用javapackager构建jar
  • 修补javafx maven插件
  • 在我的pom中显式添加JavaFX作为依赖项。xml,希望汇编插件能为我打包

以上都没有成功。我能够启动我的应用程序的唯一方法是直接从IDE中启动,这似乎意味着JavaFX库在我的系统上仍然可用。

有什么办法让它(再次)运行吗?

共有1个答案

锺离昂然
2023-03-14

简短回答

我用openJDK 11运行jar,在用openJDK 8构建jar时,它不包括JavaFX。案件已结案。

调查结果、细节和原因

因为我的IDE能够运行我的代码而没有问题,所以我认为问题是特定于我的配置/机器的。正如Canonical/Ubuntu所决定的

[用于]仿生[…]2018年9月/10月,将默认的JRE/JDK作为SRU主要迁移到OpenJDK 11。阿斯库布图

并且,正如在另一个SO线程上指出的那样:

JavaFX 11不再是JDK StackOverflow的一部分

(这还包括如何使用JDK 11修复此问题的说明)

最后,正如墨菲定律所说,我于10月4日开始打包项目,并决定于10月8日通过apt安装eclipse,其中包括openjdk-11-jdk:amd64(这记录在有用的var/log/apt/history.log中)。

这也更新了我的java,指向v11。由于我运行jar时没有显式指定java二进制文件,因此它崩溃了。

跑步

/usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar target/app.jar

因为快速测试按预期工作。现在我只需要将我的项目升级到openJDK 11,否则总是使用特定的JDK 8运行我的应用程序。

 类似资料:
  • 我有一个Java8应用程序,它使用JavaFX,主类扩展了JavaFX.application.application。目前,我将它作为一个fat jar交付,它在Oracle Java8上运行良好。 现在我希望它能够在OpenJDK11上运行。为了添加JavaFX,我已经将org.openjfx中的工件添加到类路径中,并将它们包含在fat JAR中。如果我从命令行启动我的jar,我会得到 脏的一

  • 通过将以下代码片段复制到构建中,我使用netbeans创建了javafx独立应用程序。xml文件 我有x64位版本的jdk环境,所以它创建了只在x64位版本的窗口或操作系统中运行的应用程序。有人能告诉我应该如何改变部署方法,使应用程序在x86位系统上运行。默认情况下netbean占用了64位版本的jdk环境

  • 虽然我们已经了解了网络传输 Git 数据的常用方法(如 HTTP,SSH 等),但还有另外一种不太常见却又十分有用的方式。 Git 可以将它的数据 “打包” 到一个文件中。 这在许多场景中都很有用。 有可能你的网络中断了,但你又希望将你的提交传给你的合作者们。 可能你不在办公网中并且出于安全考虑没有给你接入内网的权限。 可能你的无线、有线网卡坏掉了。 可能你现在没有共享服务器的权限,你又希望通过邮

  • 配置 在开始写扩展之前,你需要在系统上配置如下几个工具: 下载并全局安装 Composer ,为扩展生成自动加载。 配置 Node.js 并全局安装 Gulp ,编译扩展的客户端 JavaScript。 除此之外,你也可以安装 Flarum 的 Vagrant 开发者镜像,它帮你自动装好了所有工具。 生成框架 Flarum 有便利的工具来为你生成扩展的框架,这样你就可以马上开始写代码了。打开终端并

  • 打包 本章描述如何给你的扩展打包。正如 综述 中提到的扩展文件是一个签名的ZIP文件,扩展名是crx。比如 myextension.crx. 注意: 如果你使用 Chrome Developer Dashboard,发布你的扩展,你将无需自己打包。你自己打包一个crx的唯一原因是你需要发布一个非公开版本,比如一个alpha测试版本给测试用户。 当你打包一个扩展到时候。这个扩展获得唯一的一对密钥,其

  • 分发自由软件的标准形式是源代码。无论软件是否以源代码的形式(例如解释性语言Perl、Python和PHP等等)运行,还是必须首先编译(例如C、C++和Java等),这一点是毋庸置疑的。通过编译好的软件,大多数用户可能无需自己编译源代码,而只需安装预先编译的二进制包(见本章后面的the section called “二进制包”)。然而,这些二进制包依然来自主源代码分发包。原因是源代码包明确定义了发