すべてのユーザーにインストールしたいJavaコマンドラインプログラムがたくさんあります。
/dist
NetBeansを使用してビルドすると、必要なすべてのライブラリを含むディレクトリが作成されますmyprog1.jar
。/libs
それを実行する一般的な方法はそこに行くjava -jar my.jar -options
。
だから私がやりたいことはmyprog1 -options
どこでも入力して実行することです。
私が考えた方法は次のとおりです。
- とを
/opt/myjava/myprog1
含む生成。myprog1.jar
/libs
- すべてのコマンドライン引数を単純にリダイレクトする
myprog1
bashスクリプトを作成します。/usr/local/bin
java -jar /opt/myjava/myprog1/myprog1.jar
私はbashスクリプトがあまり好きではありません...これが合理的なアプローチであれば、各プログラムに可変数とパラメータの順序があることを考えると、スクリプトはどのように見えますか?スクリプトは、出力リダイレクトや>
パイプなどの標準のUnixビットについても心配する必要がありますか|
?
答え1
BashとJavaの実行可能ファイルは、リダイレクトされたコンテンツを処理する方法を知っています。exec
シェルスクリプトを実行する代わりに、スクリプトソルバーを使用しようとしています。
#!/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
。