JRE 有很多版本,也有很多廠商出,因此,FreeBSD 有提供一個 ports 叫做 java/javavmwrapper,是一組 shell script,會自動依據設定,從安裝於系統中的眾多 JRE 中,選擇最新或最適當的 JVM,設定環境變數後,執行 java 程式。java/javavmwrapper 安裝的主 script 叫 javavm,後面以此稱之。

然而,有些用 Java 寫的重量級套件,會附上完整的啟動 script,自動進行相關的設定,如 CLASSPATH 等。而這些啟動 script,其實並不懂怎麼使用 javavm,因此需要人工設定如 JAVA_HOME 等環境變數。也就是說,要用這些 script,我們就沒辦法利用 javavm 聰明的功能,來幫我們管理 JVMs。

還好,UNIX 系統的強項,就是方便的指令組合功能。如果 JAVAVM_DRYRUN 環境變數存在的話,javavm 就不會真的執行 JVM,而是將相關的環境變數印出來。透過這個機制,我們就可以重用 javavm 的聰明管理機制。如下:

env `env JAVAVM_DRYRUN=yes java | xargs echo` bin/startup.sh

在 FreeBSD 裡,裝了 java/javavmwrapper 以後,/usr/local/bin/java 其實會指到 javavm,自動幫我們選擇 JVM,因此上面的指令我們可以直接使用 java 呼叫。利用 env,我們讓 javavm 一行一行地印出 Java 相關的環境變數,如下:

JAVA_HOME=/usr/local/diablo-jdk1.5.0JAVAVM_CONF=/usr/local/etc/javavmsJAVAVM_OPTS_CONF=/usr/local/etc/javavm_opts.confJAVAVM_PROG=/usr/local/diablo-jdk1.5.0/bin/javaJAVAVM_OPTS=JAVAVM_COMMAND=/usr/local/diablo-jdk1.5.0/bin/java

然後,pipe 給 xargs echo 將這幾行接起來,以空白隔開,然後再餵給 env,變成套件所需的 java 環境變數,以啟動 bin/startup.sh