在 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"
说什么都没有。