Java 1.8 jar在Windows而非Ubuntu上运行,“找不到或加载主类...”

时间:2020-04-26 07:26:45

标签: java ubuntu java-8 jar

我有一个jar文件,该文件可以从Windows 10命令行正常运行,但不能在我的桌面Ubuntu 18.04命令行上运行。该文件从Eclipse中以jar格式导出,并复制到Ubuntu。该项目有大约30个班级,提供了六个软件包。为了简化此问题,我做了一些重命名。

这是用于运行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一起使用。

1 个答案:

答案 0 :(得分:0)

这里的问题是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 (位于/jre/lib/ext文件夹中),则可以在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的jars。

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

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

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