如何使JAR文件Linux可执行(范例)

・3 分钟阅读

每个Java程序员都知道 - 或者应该知道 - 可以创建一个可运行的Java包存档(JAR),这样,为了启动一个应用程序,只需在Java解释器命令行上指定jar文件名( -jar参数)即可。例如:

$ java -jar helloworld.jar

有很多教程展示了如何使用Ant,Maven,Eclipse,Netbens等来实现这个特性。

无论如何,它只需要在jar包中添加一个MANIFEST.MF文件,Manifest必须包含一个指定用于定义应用程序主要方法的类的项Main-Class ,例如:


$ javac HelloWorld.java
$ echo Main-Class: HelloWorld > MANIFEST.MF
$ jar -cvmf MANIFEST.MF helloworld.jar HelloWorld.class 

但是这仍然需要你的用户使用-jar选项调用Java解释器,

这就是高级技巧!

这种技术是基于将通用二进制负载附加到Linux shell script的能力,在这里阅读更多内容: http://www.linuxjournal.com/content/add-binary-payload-your-shell-scripts

利用这种可能性,只需将可运行的jar文件嵌入到Bash脚本文件中即可,执行时脚本将启动Java解释器,将自己指定为要运行的jar。

假设你有一个名为helloworld.jar的可运行jar

将Bash脚本复制到名为stub.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 

将jar文件追加到保存的脚本,并且将执行权限授予由以下命令导致的文件:

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

这就是全部!

现在你可以在shell终端上直接输入helloworld.run来执行这个。

脚本足够聪明,可以将任何命令行参数透明地传递给Java应用程序,很酷是不是!

如果您是Windows用户,显然这不起作用(除非您运行像Cygwin这样的Linux兼容层)。

但仍然有能够将Java应用程序包装到本机Windows .exe二进制文件中的工具,与本教程中解释的有同样效果,请参阅http://launch4j.sourceforge.net/示例

Xn_warm profile image