【问题标题】:JavaFX packaging: NoClassDefFoundErrorJavaFX 打包:NoClassDefFoundError
【发布时间】:2019-03-16 15:22:51
【问题描述】:

我使用 maven 和 OpenJDK 1.8 打包了一个 JavaFX 应用程序 我的 pom.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 commit,包装最终起作用了。 经过一天左右的多次这样的构建(我无法弄清楚发生了什么变化),由于以下错误,我无法再启动 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-plugin
  • 在我的 pom.xml 中显式添加 JavaFX 作为依赖项,希望程序集插件会为我打包它

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

关于如何让它(再次)运行的任何想法?

【问题讨论】:

  • 你确定在构建项目时没有使用oracle jdk吗?
  • @mrmcwolf 它被配置为使用/usr/lib/jvm/java-1.8.0-openjdk-amd64,所以很确定,是的

标签: java maven javafx


【解决方案1】:

简答

我在使用 openJDK 8 构建时使用不包含 JavaFX 的 openJDK 11 运行我的 jar。案例已结束。

调查结果、细节和原因

由于我的 IDE 能够毫无问题地运行我的代码,我推测该问题特定于我的配置/机器。事实证明,Canonical/Ubuntu 决定了

[For] Bionic [...] 将 main 中的默认 JRE/JDK 移动到 OpenJDK 11 中 2018 年 9 月/10 月作为 SRU。 AskUbuntu

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

JavaFX 11 不再是 JDK 的一部分不再 StackOverflow

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

最后,按照墨菲定律,我在 10 月 4 日设置了我的项目打包,并决定在 10 月 8 日通过 apt 安装 eclipse,其中包括 openjdk-11-jdk:amd64(这是登录有用的 /var/log/apt/history.log)。

更新了我的/etc/alternatives/java 指向 v11。由于我在没有明确指定 java 二进制文件的情况下运行了我的 jar,所以它坏了。

跑步

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

快速测试按预期工作。现在我只需要将我的项目升级到 openJDK 11 或者始终使用特定的 JDK 8 运行我的应用程序。

【讨论】:

  • 对于它的价值,您的“简短回答”的措辞是“我使用 openJDK 11 运行我的 jar,而使用 openJDK 8 构建它时不包括 JavaFX。”这正是你想说的吗?理想情况下,我很想能够从其余的答案中弄清楚,但恐怕我做不到。
  • @pateksan 这正是我的意思。我跑了java -jar [...]。这意味着在我收到 Ubuntu 更新之前是 Java 8,之后是 Java 11。要解决它,也许在askubuntu.com/questions/1139155/… 上看到基本相同的问题
  • 不知道为什么我现在才注意到您的回复。谢谢,但我在谈论“虽然不包括”。可能是在此位中意外使用了“while”一词(也许您在某些时候改写了该句子)。如果我对更广泛的主题有更好的理解,我可能能够正确地解释你的句子。但是在我的知识水平上,您似乎可能意味着各种各样的事情。这有意义吗?
  • @pateksan 你是绝对正确的。我修正了句子。泰
猜你喜欢
  • 2023-03-07
  • 2014-01-01
  • 2018-09-19
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
  • 2017-08-01
  • 2012-11-01
相关资源
最近更新 更多