我有一个从Windows 10命令行运行良好的jar文件,但不能在桌面Ubuntu 18.04命令行上运行。该文件以jar的形式从Eclipse中导出,并复制到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上使用java8运行。(
我运行了下面的检查,显示了所有文件,并确认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
还有什么建议可以试试吗?
对于grins,使用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确实包含CCD_ 1。自JavaFX2以来,它一直是Java的一部分。
更新:我在运行OpenJDK8的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类Application的类上。
如何解决此问题?
我测试了很多东西。
首先,可以使用Oracle的JDK1.8。由于许可证问题,我排除了这种可能性。
一些网站建议从Oracle JDK 1.8或使用JavaFX并使用自包含JRE的工作Java程序中复制jfxrt.jar。我发现,如果我作为外部jar链接到Oraclejfxrt.jar(位于/jre/lib/ext
文件夹中(,我就可以在Eclipse中运行一个简单的"Hello-world"javafx程序。但在程序导出到一个罐子后,我无法运行它。
在一个相关的stackoverflow线程上,有一个答案建议复制几个额外的文件以及jfxrt.jar,我试过了。这不起作用,所以我不会把它传下去。
最成功的解决方案来自@dave_thomson_085在评论中提供的链接,"我如何在Ubuntu 18.04.2 LTS上使用OpenJDK 8运行Java FX?"?。
这个答案包括清除并用旧版本重新安装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在Ubuntu桌面上的WindowsEclipse上运行和测试包含Java8的jar。
我确实收到了一条我还没有处理的警告信息:
Gtk-Message: 13:25:40.829: Failed to load module "canberra-gtk-module"
但这并没有阻止我的程序运行。