gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:09:46 25 4
gpt4 key购买 nike

我有一个 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

list 似乎是正确的。

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 一起使用。

最佳答案

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

如何解决这个问题?

我测试了很多东西。

首先,可以使用 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

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

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

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

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

关于java 1.8 jar 在 Windows 中运行而不是在 Ubuntu 中运行, "could not find or load main class ...",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61437209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com