【发布时间】: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 一起使用。
【问题讨论】:
-
LaunchThis有public 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