Bash

如何安裝多個 java 命令行程序?

  • September 28, 2011

我有一堆我編寫的 java 命令行程序,想為所有使用者安裝。

使用 NetBeans 建構,我得到一個/dist包含所有必要庫的目錄myprog1.jar和一個目錄。/libs通常的執行方法是去那里和java -jar my.jar -options

所以我想做的就是myprog1 -options從任何地方輸入並讓它執行。

我想到的方法是:

  1. 創建/opt/myjava/myprog1which containsmyprog1.jar及其 /libs.
  2. 創建一個 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.txtLinux 核心文件中。要創建與上述類似的條目,請執行命令

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 "$@"

引用自:https://unix.stackexchange.com/questions/21570