Bash
如何安裝多個 java 命令行程序?
我有一堆我編寫的 java 命令行程序,想為所有使用者安裝。
使用 NetBeans 建構,我得到一個
/dist
包含所有必要庫的目錄myprog1.jar
和一個目錄。/libs
通常的執行方法是去那里和java -jar my.jar -options
。所以我想做的就是
myprog1 -options
從任何地方輸入並讓它執行。我想到的方法是:
- 創建
/opt/myjava/myprog1
which containsmyprog1.jar
及其/libs
.- 創建一個 bash 腳本
myprog1
,在/usr/local/bin
其中簡單地將所有命令行參數重定向到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
直接添加選項的包裝腳本。
Bash 和 Java 執行檔知道如何處理重定向內容。您想使用
exec
以替換執行 shell 腳本的腳本解釋器。#!/bin/bash exec java -jar ....jar "$@"