我有一个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一起使用。
答案 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"
但这并不妨碍我的程序运行。