iovxw

Linux 下将 .jar 制作为可直接执行文件

大概是通用的

一般终端环境下要运行一个(有入口的) jar,需要 java -jar xxxx.jar

桌面环境则需要选择指定 java 来运行,需要设置默认。都不是很方便

通常都是写一个脚本来执行 java -jar,但是这样就变成两个文件了,强迫症不舒服

解决方法很简单,把这俩拼成一个文件就行了:

先写一个启动脚本存为 stub.sh (名字可以随便,只要后面别弄错就行)(来源

#!/usr/bin/env bash
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 

逐行讲解一下这个脚本写了啥

#!/usr/bin/env bash # shebang,用于启动解释器,我改成了使用 env 来运行 bash,更靠谱
MYSELF=`which "$0" 2>/dev/null` # 找到这个脚本所在的绝对路径(如果是在 $PATH 里)
[ $? -gt 0 -a -f "$0" ] && MYSELF="./$0" # 上一步失败的话,使用相对路径
java=java # 指定 java 命令
if test -n "$JAVA_HOME"; then # 如果用户设置了 $JAVA_HOME 的话
    java="$JAVA_HOME/bin/java" # 那就用用户设置的 $JAVA_HOME 里的 java
fi
exec "$java" $java_args -jar "$MYSELF" "$@" # 运行 java -jar,同时传递参数。
exit 1 # 如果上面调用 exec 失败,则会返回退出码 1

然后就是拼接起来:

cat stub.sh hello.jar > hello && chmod +x hello

上面命令的意思是,将 stub.shhello.jar 拼接到一起,存为 hello,然后给 hello 添加执行权限

如果你用普通文本编辑器打开 hello 的话就会发现文件前半部分是 stub.sh,后半部分是 hello.jar(当然是乱码状态)

以后使用时就可以像其他程序一样了,当然还是得装 java 的

这个文件也仍然可以用 java -jar 运行,java 会自动忽略前面添加的脚本


BTW

  1. 理论上只要有 bash 的地方,这个方法都通用,比如 OS X。但是没测试所以标题还是只写了 Linux

  2. 脚本也可以不用 bash 写,其他任何能被识别的脚本语言都可以的,但是首先你需要安装

  3. 其实可以只用 shebang 来启动,但是这玩意各个平台都有差异,比如 linux 下就不支持多参数,实在不靠谱。 有兴趣可以看:https://gist.github.com/briandealwis/782862