首页 > 解决方案 > java 1.8 jar 在 Windows 而非 Ubuntu 中运行,“找不到或加载主类...”

问题描述

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

这是用于运行 jar 的命令:

java -jar myproject.jar

在 Ubuntu 上,我收到错误“无法找到或加载主类 com.abLaunchThis”

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

我使用以下命令验证了当前的 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 运行。)

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

java tj myproject.jar

清单似乎是正确的。

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

我还尝试解压缩 jar 并直接从包含 /com 和 META-INF 的文件夹 /myproject 运行程序。这应该有效,不是吗?

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 的一部分。

更新:我在运行 OpenJDK 8 的 Eclipse 的 Ubuntu 安装上制作了两个“Hello world”jar,一个有 JavaFX,一个没有 JavaFX。为了运行 JavaFX 版本,我下载了 Oracle JDK 1.8,并链接到 /lib/etc /jfxrt.jar 作为“外部 jar”库。这两个程序都在 Eclipse 中运行,但只有非 FX jar 可以工作。FX jar 给出了完全相同的错误消息。

我认为这几乎确定了我的问题之一是没有将 JavaFX 作为 OpenJDK 8 的一部分。

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

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

标签: javaubuntujava-8jar

解决方案


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

如何解决这个问题?

我测试了很多东西。

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

一些站点建议从 Oracle JDK 1.8 或从使用 JavaFX 并使用自包含 JRE 的工作 Java 程序复制jfxrt.jar 。我发现如果我作为外部 jar链接到 Oracle jfxrt.jar(位于文件夹中),我可以在 Eclipse 中运行一个简单的“Hello world”javafx 程序。/jre/lib/ext但是在将程序导出到 jar 后,我无法运行该程序。

相关stackoverflow线程上的一个答案建议复制几个附加文件以及我尝试过的jfxrt.jar。这没有用,所以我不会传递它。

最成功的解决方案来自@dave_thomson_085 评论中提供的链接,如何让 Java FX 在 Ubuntu 18.04.2 LTS 上与 OpenJDK 8 一起运行?.

此答案涉及使用旧版本清除和重新安装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

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

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

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

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


推荐阅读