![如何安装多个java命令行程序?](https://linux22.com/image/18047/%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85%E5%A4%9A%E4%B8%AAjava%E5%91%BD%E4%BB%A4%E8%A1%8C%E7%A8%8B%E5%BA%8F%EF%BC%9F.png)
我有一堆我编写的 java 命令行程序,想为所有用户安装。
使用 NetBeans 进行构建,我得到一个/dist
包含所有必需库的目录myprog1.jar
。/libs
通常的运行方法是去那里然后java -jar my.jar -options
。
所以我想做的就是myprog1 -options
从任何地方输入并运行它。
我想到的方法是:
- 创建
/opt/myjava/myprog1
其中包含myprog1.jar
及其/libs
. - 创建一个 bash 脚本
myprog1
,其中/usr/local/bin
只需将所有命令行参数重定向到java -jar /opt/myjava/myprog1/myprog1.jar
我不太热衷于 bash 脚本...如果这是一个合理的方法,考虑到每个程序都有可变的参数数量和顺序,该脚本会是什么样子?脚本是否还必须担心标准 Unix 位,例如输出重定向>
和管道|
?
答案1
Bash 和 Java 可执行文件知道如何处理重定向内容。您希望使用exec
脚本解释器来代替运行 shell 脚本。
#!/bin/bash
exec java -jar ....jar "$@"
答案2
您可以编写一个包装器脚本来执行一个以其调用方式命名的 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
直接添加选项。