JavaFX:无法在 Linux 上查找或加载主类

2022-09-04 21:52:29

我已经使用Intellij Idea在Windows中使用Java(FX)开发了一个程序,并且运行良好,然后我导出了工件(jar),并且在Windows上运行它没有问题(无论是使用控制台还是双击它)。

然后我把它复制到我的Ubuntu VM,但它说

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

答案 1

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

# aptitude install openjfx  

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


答案 2

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

sudo apt install openjfx

关键的下一步: -->然后,正如@Lotfi建议的这个堆栈溢出所回答的那样,在运行jar时,您需要将路径传递给这些OpenJFX模块。官方文档也是这么说的。所以对于跑步,你说: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

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

为什么java的错误消息是愚蠢的

在这种情况下,该消息实际上具有误导性,与无法找到自己无关。勤奋地检查罐子的内容,并检查路径是否在 ,就像你所做的那样 - 没有提供任何线索。Could not find or load main class sample.Mainsample.Mainjar -tf javafx1.jarsample.MainMETA-INF/MANIFEST.MF

因为依赖于JavaFX并且因为找不到后者,Java错误地告诉你这就是问题所在,而不是报告缺少依赖项 - Java IMO没有良好的行为。您可以使用 来隔离问题,例如: 告诉我缺少什么。sample.Mainsample.Mainjdepsjdeps -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"

说没有遗漏任何东西。