【问题标题】:java 1.8 jar runs in Windows not Ubuntu, "could not find or load main class ..."java 1.8 jar 在 Windows 而非 Ubuntu 中运行,“找不到或加载主类...”
【发布时间】:2020-04-27 05:24:31
【问题描述】:

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

这是用于运行 jar 的命令:

java -jar myproject.jar

在 Ubuntu 上,我收到错误“无法找到或加载主类 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 运行。)

我运行了以下检查,它显示了所有文件,并确认 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 一起使用。

【问题讨论】:

  • LaunchThispublic static void main(String[] args) 吗?
  • 是的。并且完全相同的 jar 在 Windows 上运行。
  • (1) java jt jarfile 是一个错误;你的意思是jar tf jarfile? (2) Oracle j8包含JFX,但OpenJDK不一定。请参阅stackoverflow.com/questions/56166267askubuntu.com/questions/1091157askubuntu.com/questions/1137891 (3) 但即便如此,它也应该给出更清晰的错误。尝试添加-verbose 看看是否可以缩小范围。
  • 修复了 jt/tj 混淆。谢谢。在过去的几个小时里,我一直在研究 JavaFX 的角度。我发现我的 OpenJDK 8 没有 jfxrt.jar。所以这很可能是问题所在。您的链接看起来很有希望。它们不是我在搜索 OpenJFX 8 中缺少的 JFX 时发现的。OpenJFX 默认值似乎是 11,并且不适用于 OpenJDK8,但是您的一个链接具有早期版本。我确实下载了 Oracle 1.8,并且正在考虑将它的 jfxrt.jar 副本弹出到 OpenJDK8 /lib 中。会让您知道最终的效果。
  • 在 docker 中运行 lol

标签: java ubuntu java-8 jar


【解决方案1】:

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

如何解决这个问题?

我测试了很多东西。

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

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

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

最成功的解决方案来自@dave_thomson_085、How do I get Java FX running with OpenJDK 8 on Ubuntu 18.04.2 LTS?评论中提供的链接。

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

但这并不妨碍我的程序运行。

【讨论】:

    猜你喜欢
    • 2019-02-21
    • 2021-06-06
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    相关资源
    最近更新 更多