【问题标题】:JavaFX: Could not find or load main class only on linuxJavaFX:仅在 linux 上无法找到或加载主类
【发布时间】:2016-09-17 14:50:26
【问题描述】:

我使用 Intellij Idea 在 Windows 中使用 Java(FX) 开发了一个程序,效果很好,然后我导出了工件 (jar),在 Windows 上运行它没有问题(使用控制台和双击它)。

然后我将它复制到我的 Ubuntu 虚拟机中,但那里显示

Error: Could not find or load main class sample.Main

这是清单:

Manifest-Version: 1.0
Main-Class: sample.Main

JAR 文件结构如下所示:

test.jar
--- META-INF
--- --- MANIFEST.MF
--- org
--- --- json
--- --- --- // json library
--- sample
--- --- Contacts.class
--- --- Controller.class
--- --- Main.class
--- --- sample.fxml

【问题讨论】:

标签: java linux ubuntu intellij-idea javafx


【解决方案1】:

Ubuntu 和 Debian 一样,有一个单独的 OpenJFX 包(OpenJDK 的 JavaFX 实现)。为什么会这样,当 JavaFX 是 JRE 的一个组成部分时 - 我不知道,但你的问题应该通过安装 OpenJFX 包来解决:

# aptitude install openjfx  

(或使用任何其他包管理器),或使用 Oracle 的 JRE。

【讨论】:

  • 在 Ubuntu 19.10 下,发出上述命令(必须使用 sudo)并没有解决我的问题。奇怪的是 jar 在 Mac 上可以正常工作,但在 Ubuntu 上不行。
  • 自行安装 openjfx 并没有解决我在 Ubuntu 19.10 上的问题。由@abulka 编写的The answer 包含完整的修复程序。
【解决方案2】:

在 Mac 上使用 IntelliJ 开发了一个名为 javafx1.jar 的演示 jar 并希望在 Linux 上运行它之后,我自己遇到了这个确切的问题。在使用sudo apt install default-jdk 在 Ubuntu 19.10 上安装 jdk 后,我还需要安装 OpenJFX,它不再与 openjdk 11 捆绑在一起。我使用了常规的 apt 命令:

sudo apt install openjfx

关键的下一步:--> 然后正如@Lotfi 的这个stackoverflow 回答所建议的那样,在运行您的jar 时,您需要将路径传递给那些OpenJFX 模块。这也是official docs say。所以对于运行javafx1.jar 你说:

java --module-path /usr/share/openjfx/lib --add-modules=javafx.controls,javafx.fxml,javafx.base,javafx.media,javafx.web,javafx.swing -jar javafx1.jar

这是一条令人讨厌的长线,必须使用。您可以缩短它以使用 ALL-MODULE-PATH 参数指定该目录中的所有模块:

java --module-path /usr/share/openjfx/lib --add-modules ALL-MODULE-PATH -jar javafx1.jar

附:您可以通过运行dpkg-query -L javafx 找到系统上 javafx 模块路径的位置。

为什么java的错误信息是哑的

在这种情况下,Could not find or load main class sample.Main 消息实际上具有误导性,与无法找到 sample.Main 本身无关。用jar -tf javafx1.jar 仔细检查jar 的内容,并检查sample.Main 的路径是否在META-INF/MANIFEST.MF 中,就像你所做的那样 - 没有提供任何线索。

因为sample.Main 依赖于JavaFX,并且找不到后者,所以java 恶作剧地告诉您sample.Main 是问题所在,而不是报告缺少依赖项-java IMO 的行为不好。您可以使用jdeps 来隔离问题,例如jdeps -v javafx1.jar 告诉我缺少什么。

所以

jdeps -v javafx2.jar | grep "not found"

列出我缺少的东西,而

jdeps --module-path /usr/share/openjfx/lib --add-modules=ALL-MODULE-PATH -v javafx1.jar | grep "not found"

说什么都没有。

【讨论】:

    【解决方案3】:

    更有效的解决方案是在 Debian 上使用 Oracle JRE。当我在 Windows 上使用 InteliJ Idea JavaFX Packager 构建我的 JavaFX 项目时,我观察到了相同的行为。用普通的 Maven 建项目不会导致这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 2015-07-25
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多