我使用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
答案 0 :(得分:9)
# 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模块路径在系统上的位置。
在这种情况下,消息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,并且由于找不到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"
说什么都没丢失。