如何将 .java 或 .jar 文件转换为 Linux 可执行文件(没有 .jar 扩展名,这意味着它不是 .jar 文件)

How to convert a .java or a .jar file into a Linux executable file ( without a .jar extension, which means it's not a .jar file )

我一直在搜索许多关于此的类似帖子,但我仍然找不到我的答案。我想将 .java 程序转换为 Linux 可执行文件,不带 .jar 扩展名。我该怎么做?我正在尝试使用 Launch4j java 包装器、JWrapper、IzPack、制作 .sh、制作 .bat、运行 它使用 java -jar myFile.jar 等,但是 none 他们工作了。有些程序很复杂,很难调试。有什么直接的方法可以将 .java 文件或 .jar 文件转换为 Linux 可执行文件?

我需要将此程序作为一个 Linux 可执行文件作为一个整体传递到另一个将此程序作为参数的程序中。

你可以做的是制作一个小的 C 程序,它调用一个 exec 函数(参见 man 3 exec)到 "java" 二进制文件,传递“-jar”,"xxx.jar" 作为参数,另见 Forking a new process in C++ and executing a .jar file

经过数小时的搜索和尝试,我找到了一个解决方案,这正是我想要的。就是在linux中使用gcj命令。

它的工作方式类似于用于 C 的 gcc 和用于 C++ 的 g++,它们将 C 或 C++ 程序编译成可执行文件。

首先使用终端输入 gcj 安装 gcj:

sudo apt-get install gcj-jdk

之后cd到.jar文件所在目录,假设.jar文件是myFile.jar,然后执行:

gcj myFile.jar -o newNameofTheFile --main=theMainClassNameofTheFile

编译.jar文件。它应该像一个可执行文件一样工作,只需 运行 在命令行中像这样:

./newNameofTheFile

假设您有一个名为 helloworld.jar

的可运行 jar

将下面的 Bash 脚本复制到名为 stub.sh

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

然后将 jar 文件附加到保存的脚本并授予对使用以下命令生成的文件的执行权限:

cat stub.sh helloworld.jar > helloworld.run && chmod +x helloworld.run 

就这些了!

现在您只需在 shell 终端上输入 helloworld.run 即可运行该应用程序。

该脚本足够智能,可以透明地将任何命令行参数传递给 Java 应用程序。

致谢:Paolo Di Tommaso

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

将 jar 转换为 Linux 可执行文件的另一个简单技巧是在 jar 文件之前放置一个 shebang。

假设我们有一个 hello.jar 文件。

$ java -jar hello.jar
hello world!

您可以按照以下步骤创建可执行文件。

$ echo "#! /usr/bin/env java -jar" > hello
$ cat hello.jar >> hello
$ chmod +x hello

然后就可以直接执行hello文件了

$ ./hello
hello world!