先日から、Rhinoを使っていろいろプログラムを作っています。
それで、Mac OS Xで作って使っているのは問題ないのですが、
せっかくJava上で動くのだからと、Windowsでも動かそうとしています。
ところが、意外とjavaコマンド(JREのJava)を実行するのが難しく苦慮しています。
大抵の環境では、Systemディレクトリ以下にjava.exeが入っているので、(ここにはパスが通っているので)普通に「java -jar xxx.jar」のようなコマンドのバッチファイルを作るだけで良いはずです。
しかし、最近インストールした、Windows8(64bit)では、Systemディレクトリに、
Javaコマンドはコピーされませんでした(!)
また、いろいろ調べてみると、レジストリのキーにJREのバージョンやパスが書かれているとありました。(それは以下のキーです。)
HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment
しかし、上記の環境では、Javaをインストールしても、ここに値が設定されません。
そこで、レジストリ内を検索し、(さらに追加調査してみると)64bit版のWindowsには以下のキーに設定が書かれることが分かりました。紛らわしいですね。
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Java Runtime Environment
とは言え、64bitだからと言って、必ずこのキーに設定が書かれるわけではないようで・・・かなり厄介です。そこで、WSH/JScriptでJava(JRE)を起動するために、以下のようなコードを書いてみました。
// シェルオブジェクトを取得 var shell = new ActiveXObject("WScript.Shell"); // Javaコマンドのパスを取得(32bit/64bit対応) var jre_java = "", jre_ver, jre_home; var rpath = "HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment"; try { jre_ver = shell.RegRead(rpath+"\\CurrentVersion"); jre_home = shell.RegRead(rpath+"\\"+jre_ver+"\\JavaHome"); jre_java = jre_home + "\\bin\\javaw.exe"; } catch(e) { try { rpath = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\JavaSoft\\Java Runtime Environment"; jre_ver = shell.RegRead(rpath+"\\CurrentVersion"); jre_home = shell.RegRead(rpath+"\\"+jre_ver+"\\JavaHome"); jre_java = jre_home + "\\bin\\javaw.exe"; } catch (e) { WScript.Echo( "Javaがインストールされていません。\n"+ "ダウンロードページを開きます。"); var sa = new ActiveXObject("Shell.Application"); sa.Open("http://java.com/"); WScript.Quit(); } } // コマンドを構成する var cmd = [ jre_java, "-Dfile.encoding=UTF-8", "-cp \"" + JAR_PATH + "\"", MAIN_CLASS ]; // 引数を設定する for (var i = 0; i < WScript.Arguments.Count(); i++) { cmd.push("\"" + WScript.Arguments.Item(i) + "\""); } var cmd_str = "" + cmd.join(" ") + ""; shell.Exec(cmd_str);
以上。