我有一堆java命令行程序,我已经编写并希望为所有用户安装.
使用NetBeans构建,我得到一个包含myprog1.jar的/ dist目录和一个包含所有必需库的/ libs目录.通常的运行方法是去那里和java -jar my.jar -options.
所以我想做的就是从任何地方输入myprog1 -options并让它运行.
我想到的方法是:
>创建/ opt / myjava / myprog1,其中包含myprog1.jar及其
/库.
>在/usr/local/bin中创建一个bash脚本myprog1,它只是将所有命令行参数重定向到java -jar /opt/myjava/myprog1/myprog1.jar
我不太热衷于bash脚本…如果这是一个合理的方法,那个脚本会是什么样的,因为每个程序都有一个可变数量和参数顺序?脚本是否还要担心标准的Unix位,例如输出重定向>和管道|?
解决方法:
您可以编写一个包装程序脚本来执行以其调用方式命名的jar,并为每个jar创建一个符号链接.这是jar-wrapper脚本(警告,直接在浏览器中输入):
#!/bin/sh
name=$(basename "$0")
jar=
for dir in /opt/myjava/*; do
if [ -e "$dir/$name.jar" ]; then jar=$dir/$name.jar; break; fi
done
if [ -z "$jar" ]; then
echo 1>&2 "$name.jar not found"
exit 126
fi
exec /your/favorite/java -jar "$jar" "$@"
然后根据需要创建尽可能多的包装器脚本的符号链接,并根据需要将它们放在$PATH中:
ln -s wrapper-script myprog1
ln -s wrapper-script myprog2
如果您正在运行Linux,并且您是系统管理员,则可以选择Java解释器以使jar可直接执行,这要归功于binfmt_misc机制.
例如,在我的系统上:
$cat /proc/sys/fs/binfmt_misc/jar
enabled
interpreter /usr/lib/jvm/java-6-sun-1.6.0.07/jre/lib/jexec
flags:
offset 0
magic 504b0304
该系统在Documentation/binfmt_misc.txt
的Linux内核文档中有记录.要创建类似上面的条目,请运行该命令
jexec=/usr/lib/jvm/java-6-sun-1.6.0.07/jre/lib/jexec
echo >/proc/sys/fs/binfmt_misc/register ":jar:M:0:504b0304::$jexec:"
您的发行版可能具有在引导时进行binfmt注册的机制.在Debian和衍生产品上,这是update-binfmts
,JVM包已经注册了jexec.
如果需要传递选项,请注册一个包装器脚本,该脚本直接添加选项而不是jexec.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。