JavaFX:无法在Linux

时间:2016-05-20 11:00:24

标签: java linux ubuntu intellij-idea javafx

我使用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

3 个答案:

答案 0 :(得分:9)

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

# aptitude install openjfx  

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

在Mac上使用IntelliJ开发了一个名为javafx1.jar的演示jar并想在Linux上运行它之后,我自己遇到了这个问题。在使用sudo apt install default-jdk在Ubuntu 19.10上安装了jdk之后,正如@Itai回答的那样,我还需要安装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

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

为什么Java的错误消息很愚蠢

在这种情况下,消息Could not find or load main class sample.Main实际上是误导性的,与无法自行找到sample.Main无关。与您一样,用jar -tf javafx1.jar仔细检查jar的内容,并检查路径sample.MainMETA-INF/MANIFEST.MF中-没有任何线索。

由于sample.Main依赖于JavaFX,并且由于找不到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"

说什么都没丢失。