【问题标题】:How can I run a .jar file that was build for Windows and Mac in Linux?如何在 Linux 中运行为 Windows 和 Mac 构建的 .jar 文件?
【发布时间】:2022-01-06 10:24:45
【问题描述】:

我需要在 Linux 上运行 Java 应用程序(“Exactly”)。它是一个传输数据的软件,由我必须与之合作的机构使用。 https://www.weareavp.com/products/exactly/ 代码库在这里:https://github.com/WeAreAVP/uk-exactly

不幸的是,程序网站只提供 Mac 和 Windows 的下载,但本质上它是一个 Java 应用程序。不过,到目前为止,Java 应用程序运行在每个支持虚拟 Java 机器的平台上。对于旧版本的“Exactly”,还有一个专用的 .jar 下载可用。在当前的“Exactly”用户指南 (https://www.weareavp.com/wp-content/uploads/2018/06/Exactly-User-Guide_v.0.1.5.pdf) 中,我发现了这句话:“Java jar 文件现在包含在​​​​​​​​​​​​​​​Windows​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​则则也就是两个Windows包​​​​​​​​​​​​​​​​​​​​​​​​​​​ ​/dist​​​​​​​​​​​​​​​​​​​​​路径)​​​​​​​​​​​​​​​​​​​​Windows​​​​​​​​​​​​​​​​​​​​​​​​​。

我从 64 位包中下载并解压了 Java 文件到目录: ~/java-anwendungen/exactly/

~/java-anwendungen/exactly/dist 中,我找到了exactly.jar 文件。我使它可执行并尝试启动它但没有成功。

$ java -jar exactly.jar
Fehler: Zum Ausführen dieser Anwendung benötigte JavaFX-Runtime-Komponenten fehlen
(Error: to execute this app needed JavaFX-runtime-components missing)

我不是 Java 开发人员,所以我不知道如何在 Ubuntu Linux 上运行 .jar 文件。我尝试了一些在 Internet 上找到的解决方案(见下文),但没有一个效果很好。欢迎任何帮助和建议!

我的环境: ubuntu 18.04.6 LTS

$ java -version
openjdk version "11.0.11" 2021-04-20
OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.18.04)
OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.18.04, mixed mode, sharing)

具体目录:

(base) viejo@notebooka:~/java-anwendungen/exactly/dist$ ls -l
insgesamt 488
drwx------ 2 viejo viejo   4096 Nov 26 18:48 bundles
-rw-rw-r-- 1 viejo viejo    696 Nov 27 01:22 derby.log
-rwxrwxr-x 1 viejo viejo 236145 Sep 19  2017 exactly.jar
-rwxrwxr-x 1 viejo viejo 236352 Nov 26 19:27 exactly.run
-rwxrwxr-x 1 viejo viejo    198 Nov 26 19:14 launchExactly
drwx------ 2 viejo viejo   4096 Nov 26 18:48 lib
-rw-rw-r-- 1 viejo viejo      0 Nov 27 01:22 logfile.txt
-rw-rw-r-- 1 viejo viejo    207 Nov 26 19:24 stub.sh
drwxrwxr-x 5 viejo viejo   4096 Nov 27 01:22 ukexactly

注意: exactly.runlaunchExactlystub.sh 文件是我按照我在 Internet 上找到的建议解决方案中的说明创建的(见下文) ukexactlylogfile.txtderby.log 文件是由解决方案 3 创建的。

我找到 javafx 的目录(从 Ubuntu 存储库安装后):

(base) viejo@notebooka:/usr/share/openjfx/lib$ ls -l
insgesamt 6500
lrwxrwxrwx 1 root root      26 Feb 19  2019 javafx.base.jar -> ../../java/javafx-base.jar
lrwxrwxrwx 1 root root      30 Feb 19  2019 javafx.controls.jar -> ../../java/javafx-controls.jar
lrwxrwxrwx 1 root root      26 Feb 19  2019 javafx.fxml.jar -> ../../java/javafx-fxml.jar
lrwxrwxrwx 1 root root      30 Feb 19  2019 javafx.graphics.jar -> ../../java/javafx-graphics.jar
lrwxrwxrwx 1 root root      27 Feb 19  2019 javafx.media.jar -> ../../java/javafx-media.jar
-rw-r--r-- 1 root root     113 Feb 19  2019 javafx.properties
lrwxrwxrwx 1 root root      27 Feb 19  2019 javafx.swing.jar -> ../../java/javafx-swing.jar
lrwxrwxrwx 1 root root      25 Feb 19  2019 javafx.web.jar -> ../../java/javafx-web.jar
-rw-r--r-- 1 root root 6651322 Feb 19  2019 src.zip

符号链接指向的目录:

(base) viejo@notebooka:/usr/share/java$ ls -l
insgesamt 10900
-rw-r--r-- 1 root root    5232 Feb 21  2019 gettext.jar
-rw-r--r-- 1 root root   35257 Apr 25  2018 java-atk-wrapper.jar
-rw-r--r-- 1 root root    2989 Sep 20  2018 java_defaults.mk
-rw-r--r-- 1 root root  749850 Feb 19  2019 javafx-base-11.jar
lrwxrwxrwx 1 root root      18 Feb 19  2019 javafx-base.jar -> javafx-base-11.jar
-rw-r--r-- 1 root root 2510966 Feb 19  2019 javafx-controls-11.jar
lrwxrwxrwx 1 root root      22 Feb 19  2019 javafx-controls.jar -> javafx-controls-11.jar
-rw-r--r-- 1 root root  127377 Feb 19  2019 javafx-fxml-11.jar
lrwxrwxrwx 1 root root      18 Feb 19  2019 javafx-fxml.jar -> javafx-fxml-11.jar
-rw-r--r-- 1 root root 4365220 Feb 19  2019 javafx-graphics-11.jar
lrwxrwxrwx 1 root root      22 Feb 19  2019 javafx-graphics.jar -> javafx-graphics-11.jar
-rw-r--r-- 1 root root  270551 Feb 19  2019 javafx-media-11.jar
lrwxrwxrwx 1 root root      19 Feb 19  2019 javafx-media.jar -> javafx-media-11.jar
-rw-r--r-- 1 root root  119827 Feb 19  2019 javafx-swing-11.jar
lrwxrwxrwx 1 root root      19 Feb 19  2019 javafx-swing.jar -> javafx-swing-11.jar
-rw-r--r-- 1 root root  714674 Feb 19  2019 javafx-web-11.jar
lrwxrwxrwx 1 root root      17 Feb 19  2019 javafx-web.jar -> javafx-web-11.jar
-rw-r--r-- 1 root root    5385 Nov 18 14:52 java_uno.jar
-rw-r--r-- 1 root root     368 Nov 18 14:52 juh-7.2.3.jar
lrwxrwxrwx 1 root root      13 Nov 18 14:52 juh.jar -> juh-7.2.3.jar
-rw-r--r-- 1 root root     356 Nov 18 14:52 jurt-7.2.3.jar
lrwxrwxrwx 1 root root      14 Nov 18 14:52 jurt.jar -> jurt-7.2.3.jar
-rw-r--r-- 1 root root    2613 Feb 21  2019 libintl.jar
-rw-r--r-- 1 root root 2191511 Nov 18 14:52 libreoffice-7.2.3.jar
lrwxrwxrwx 1 root root      21 Nov 18 14:52 libreoffice.jar -> libreoffice-7.2.3.jar
-rw-r--r-- 1 root root     356 Nov 18 14:52 ridl-7.2.3.jar
lrwxrwxrwx 1 root root      14 Nov 18 14:52 ridl.jar -> ridl-7.2.3.jar
-rw-r--r-- 1 root root     356 Nov 18 14:52 unoil-7.2.3.jar
lrwxrwxrwx 1 root root      15 Nov 18 14:52 unoil.jar -> unoil-7.2.3.jar
-rw-r--r-- 1 root root    4727 Nov 18 14:52 unoloader-7.2.3.jar
lrwxrwxrwx 1 root root      19 Nov 18 14:52 unoloader.jar -> unoloader-7.2.3.jar

我的互联网研究导致了各种建议的解决方案,但没有一个成功:

解决方案 1 创建一个 bash 脚本:

https://edencoding.com/runtime-components-error/#jar

另请参阅:Convert .jar to an application for Windows, Linux & Mac

我的 bash 文件:launchExactly:

#!/bin/bash

java -jar exactly.jar --module-path /usr/share/openjfx/lib --add-modules javafx.controls,javafx.fxml
$ ./launchExactly
Fehler: Zum Ausführen dieser Anwendung benötigte JavaFX-Runtime-Komponenten fehlen

解决方案 2 将 jar 附加到 bash 脚本:

https://coderwall.com/p/ssuaxa/how-to-make-a-jar-file-linux-executable

创建一个 bash 文件:

    #!/bin/sh
    MYSELF=`which "$0" 2>/dev/null`
    [ $? -gt 0 -a -f "$0" ] && MYSELF="./$0"
    java=java
    if test -n "$JAVA_HOME"; then
        java="$JAVA_HOME/bin/java"
    fi
    exec "$java" $java_args -jar $MYSELF "$@"
    exit 1 

附加 .jar 文件:

cat stub.sh exaxtly.jar > exactly.run && chmod +x exactly.run

也无法启动jar:

$ exactly.run
exactly.run: Befehl nicht gefunden. (command not found)

$ ./exactly.run
Fehler: Zum Ausführen dieser Anwendung benötigte JavaFX-Runtime-Komponenten fehlen
(error: JavaFX-runtime-components needed to execute app missing)

解决方案 3 使用命令行参数启动 .jar:

How do I fix JavaFX runtime components are missing?

$ java --module-path /usr/share/openjfx/lib --add-modules ALL-MODULE-PATH -jar exactly.jar

结果:

$  java --module-path /usr/share/openjfx/lib --add-modules ALL-MODULE-PATH -jar exactly.jar
[EL Info]: 2021-11-27 01:22:39.859--ServerSession(255728718)--EclipseLink, version: Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd
[EL Info]: connection: 2021-11-27 01:22:40.605--ServerSession(255728718)--file:/home/viejo/java-anwendungen/exactly/dist/exactly.jar_UKSipperflyPU login successful
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at java.desktop/javax.swing.ImageIcon.<init>(ImageIcon.java:217)
    at uk.sipperfly.ui.Exactly.<init>(Exactly.java:107)
    at uk.sipperfly.ui.Exactly$83.run(Exactly.java:2971)
    at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

创建的 derby.log 文件包含以下信息:

----------------------------------------------------------------
Mon Nov 29 12:59:52 CET 2021:
Booting Derby version The Apache Software Foundation - Apache Derby - 10.11.1.1 - (1616546): instance a816c00e-017d-$
on database directory /home/viejo/java-anwendungen/exactly/dist/ukexactly with class loader java.net.URLClassLoader@$
Loaded from file:/home/viejo/java-anwendungen/exactly/dist/lib/derby.jar
java.vendor=Ubuntu
java.runtime.version=11.0.11+9-Ubuntu-0ubuntu2.18.04
user.dir=/home/viejo/java-anwendungen/exactly/dist
os.name=Linux
os.arch=amd64
os.version=5.4.0-90-generic
derby.system.home=null
Database Class Loader started - derby.database.classpath=''

创建的logfile.txt是空的。

这种尝试是最有希望的,因为至少 .jar 启动了,但在上述错误消息中很快结束。

注意:通过使用解决方案 3 中的参数更改解决方案 1 的 bash 脚本来组合解决方案 1 和 3 会导致与解决方案 3 相同的错误。

现在我被卡住了,现在不知道如何继续,或者尝试让 .jar 文件在 Linux 下运行是否有任何价值。

【问题讨论】:

标签: java linux javafx jar ubuntu-18.04


【解决方案1】:

您需要一个 Java 8 实例。较新的版本不再具有 JavaFX 库。

【讨论】:

    【解决方案2】:

    您的错误似乎与另一个问题有关,而不是与 Java 依赖项有关。 请在迁移项目或创建 jar 文件时检查是否缺少任何图像文件。

    如果可能的话,请您粘贴代码或您尝试运行的代码的屏幕截图吗?

    【讨论】:

    猜你喜欢
    • 2015-03-10
    • 2013-01-11
    • 2011-06-10
    • 2019-06-05
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    相关资源
    最近更新 更多