如何安装多个java命令行程序?

如何安装多个java命令行程序?

我有一堆我编写的 java 命令行程序,想为所有用户安装。

使用 NetBeans 进行构建,我得到一个/dist包含所有必需库的目录myprog1.jar/libs通常的运行方法是去那里然后java -jar my.jar -options

所以我想做的就是myprog1 -options从任何地方输入并运行它。

我想到的方法是:

  1. 创建/opt/myjava/myprog1其中包含myprog1.jar及其 /libs.
  2. 创建一个 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直接添加选项。

相关内容