是否可以制作Java可执行文件?

Wil*_*oom 5 java executable interpreted-language shebang bin

为了清楚起见,通过可执行文件我并不意味着为处理器准备好字面字节.例如,当一个shebang被添加到顶部时,一个被解释且不可执行的bash脚本变得可执行,该脚本指定应该由/bin/bash/bin/sh将要解释它的任何程序运行脚本.

我想知道是否可以使用Java,这在技术上不是脚本语言,但绝对不可执行.看起来Java很难,因为用户实际上没有机会在编译文件中添加shebang,而编译的java也不能来自stdin.

Wil*_*oom 1

两年半后,我偶然发现了一个比 2016 年给出的更完整的答案。Java 二进制文件可以嵌入到可执行文件中,这与 John Hascall 的答案相反。 本文解释了如何通过向 shell 脚本添加二进制负载来在 Linux 和类 UNIX 系统中完成此操作。

我将提供该过程的简短摘要。

给定一个名为给定的可执行 jarany_java_executable.jar
给定您想要创建一个名为给定的可执行文件my_executable
给定basis.sh一个名为以下内​​容的脚本文件

#!/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
Run Code Online (Sandbox Code Playgroud)

可以通过运行以下两个命令来创建本机可执行文件。

cat basis.sh any_java_executable.jar > my_executable;
chmod +x my_executable;
Run Code Online (Sandbox Code Playgroud)

然后my_executable是一个本机可执行文件,能够运行 java 程序,而不依赖于 jar 文件的位置。可以通过运行来执行

./my_executable [arg1 [arg2 [arg3...]]]
Run Code Online (Sandbox Code Playgroud)

如果放置在/usr/local/bin.