java 1.8 jar 在 Windows 而不是 Ubuntu、"could not find or load main class ..." 中运行

java 1.8 jar runs in Windows not Ubuntu, "could not find or load main class ..."

我有一个 jar 文件,运行可以从 Windows 10 命令行运行,但不能在我的桌面 Ubuntu 18.04 命令行运行。该文件作为 jar 从 Eclipse 导出,并复制到 Ubuntu。该项目有大约 30 classes 超过六个包。为了简化这个问题,我做了一些重命名。

这是用于 运行 jar 的命令:

java -jar myproject.jar

在 Ubuntu 上,我收到错误 "Could not find or load main class com.a.b.LaunchThis"

以下是我根据许多类似帖子的建议尝试过的一些方法。抱歉,如果这是重复的,但我找不到可行的答案。

我使用以下命令验证了当前 Java 是 1.8:

$ update-alternatives --config java

$ java -version
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-8u252-b09-1~18.04-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)

(我还在 Windows 上使用 java 8 验证了程序 运行s。)

我运行进行了以下检查,其中显示了所有文件,并确认com/a/b/LaunchThis。class存在并且拼写方式完全相同。

java tj myproject.jar

清单似乎是正确的。

Manifest-Version: 1.0
Main-Class: com.a.b.LaunchThis

我还尝试直接从包含 /com 和 META-INF 的文件夹 /myproject 中解压 jar 和 运行ning 程序。那应该行得通,不是吗?

java com.a.b.LaunchThis
java com/a/b/LaunchThis
java com.a.b/LaunchThis

从 myproject 文件夹外的一层:

java myproject/com/a/b/LaunchThis
java myproject.com.a.b/LaunchThis
java myproject.com.a.b.LaunchThis
java myproject/com.a.b.LaunchThis

我不太清楚语法何时需要。要么 /。 "LaunchThis" 中包含主要入口点的包命令如下:

package com.a.b;

并且在上述每次迭代中,我还尝试将“-cp myproject.jar”作为一个选项。

总是出现完全相同的错误消息。

为了注意不要在上面出现错字,我首先 运行 ls 命令以确保可以找到该文件(然后编辑此行以创建变体)。

ls myproject.com.a.b.LaunchThis.class

关于还可以尝试什么的任何建议?

对于笑容,运行 Java11 得到这样的回应:

Error: Could not find or load main class com.a.b.LaunchThis
Caused by: java.lang.NoClassDefFoundError: javafx/event/EventHandler

这有一定道理,因为 Java11 不包括 JavaFX。但是 Java 8 确实包括 EventHandler。自 JavaFX 2.

以来,它一直是 Java 的一部分

更新:我在 Eclipse 运行ning OpenJDK 安装的 Ubuntu 上制作了两个 "Hello world" 罐子,一个有 JavaFX,一个没有 JavaFX 8. 为了将 JavaFX 的版本升级到 运行,我下载了 Oracle JDK 1.8,并链接到 /lib/etc/jfxrt.jar 作为 "external jar" 库。 Eclipse 中的两个程序 运行 但只有非 FX jar 有效。 FX jar 给出了完全相同的错误消息。

我认为这几乎可以确定我的问题之一是没有 JavaFX 作为 OpenJDK 8.

的一部分

我现在的计划是尝试两种解决方案:(1) 将 Oracle jfxrt.jar 复制到 OpenJDK 库中,(2) 回载 OpenJFX 8.

只需从存储库安装 OpenJFX 即可加载 OpenJFX 11,它有点过时但可以与 OpenJDK 11 一起使用。

这里的问题是 Ubuntu 18.04 上的存储库 OpenJDK 8 不包含 JavaFX。我猜测错误消息是由于 JavaFX main() 位于扩展 JavaFX class 应用程序的 class 上。

如何解决这个问题?

我测试了很多东西。

首先,可以改用 Oracle 的 JDK 1.8。由于许可问题,我排除了这种可能性。

一些站点建议从 Oracle JDK 1.8 或使用 [=52] 的工作 Java 程序复制 jfxrt.jar =]FX 并使用独立的 JRE。我发现如果我 linked 到 Oracle jfxrt.jar(位于 /jre/lib/ext 文件夹中)作为外部 jar,我可以 运行 一个简单的 "Hello world" Eclipse 中的 javafx 程序。但是我无法运行程序导出到jar后

相关 Whosebug 线程的一个答案建议复制几个额外的文件以及 jfxrt.jar,我试过了。这没有用,所以我不会继续讲下去。

最成功的解决方案来自@dave_thomson_085、.

评论中提供的link

此答案涉及使用旧版本清除和重新安装 openjfx,并将其标记为不接受更新。

Wolfgang Fahl(他将其归功于 Druidefix)提供的代码如下:

apt purge openjfx
apt install openjfx=8u161-b12-1ubuntu2 libopenjfx-jni=8u161-b12-1ubuntu2 libopenjfx-java=8u161-b12-1ubuntu2
apt-mark hold openjfx libopenjfx-jni libopenjfx-java

现在,我可以 运行 并使用在 Windows Eclipse 和 Ubuntu 上构建的 JavaFX 测试包含 Java8 的罐子桌面。

我确实收到了一条我尚未处理的警告消息:

Gtk-Message: 13:25:40.829: Failed to load module "canberra-gtk-module"

但这并不能阻止我的程序 运行ning。