Cygwin で Rhino

E4X をやってみたくて Rhino を入れてみた。

インストール

  1. Rhino - Java による JavaScript から Rhino のバイナリ(rhino1_6R5.zip)をダウンロードして展開
  2. E4X 用に Apache Download Mirrors - The Apache Software Foundation から xmlbeans-2.2.0.zip をダウンロードして展開

展開するフォルダは適当に。(オイラはD:\usr\java 以下にした)
必要な jar ファイルは$JAVA_HOME/lib/ext に入れて置いて自動で読み込まれるようにするのが手っ取り早いがアップデートする度に置きなすのは面倒なのでやらずに、-classpathオプションで読み込むようにする。

あと、java -jar js.jar-jarオプションで起動すると-classpathオプションやCLASSPATH環境変数が上書きされてしまうので注意。

Cygwin 用に起動スクリプト

意外と長くなってしまった。JAVA 自体は Windows 用なのでパスの設定が面倒なのだ。

コマンドライン引数の設定に不具合があったので一部修正
#!/bin/bash

RHINO_JAR="/d/usr/java/rhino1_6R5/js.jar"
XMLBEANS_LIB="/d/usr/java/xmlbeans-2.2.0/lib"
CLASSPATH=".;$( /usr/bin/cygpath -wa ${RHINO_JAR} )"

if [ -n ${JAVA_HOME} ];then
  JAVA_HOME="$( /usr/bin/cygpath -ua ${JAVA_HOME} )"
else
  JAVA_HOME="/opt/jre1.5.0_09"
fi
export JAVA_HOME
java="${JAVA_HOME}/bin/java"

# set and export CLASSPATH {{{
if [ -d ${XMLBEANS_LIB} ];then
  for cp in $( /usr/bin/cygpath -da ${XMLBEANS_LIB}/*.jar );do
    CLASSPATH="${CLASSPATH};${cp}"
  done
else
  echo "Not support ECMAScript for XML."
fi
export CLASSPATH
# }}}
# Convert Windows Path {{{
declare -a ARGV
typeset -i ARGC=0
for arg in "$@"
do
  if [ "${arg}" = "-d" ];then
    RHINO_DEBUG=1
  elif [[ "${arg}" != -* &&  -e "${arg}" ]];then
    ARGV[ARGC]="$( /usr/bin/cygpath -da ${arg} )"
  else
    ARGV[ARGC]="${arg}"
  fi
  (( ARGC++ ))
done
# }}}
# Debug message {{{
if [ ${RHINO_DEBUG} = 1 ];then
  "${java}" -version
  echo "=== CLASSPATH ==="
  echo "${CLASSPATH}" | tr ';' '\n'
  echo "=== Arguments ==="
  for arg in "${ARGV[@]}";do
    echo "${arg}"
  done
  exit 1
fi
# }}}
# execute
"${java}" org.mozilla.javascript.tools.shell.Main "${ARGV[@]}"

# vim:set sw=2 ts=2 sts=0 fdm=marker:

rhino というファイル名で保存。

やっていること
  1. 環境変数 JAVA_HOME から java 実行ファイルを設定
  2. 環境変数 CLASSPATHrhinojs.jarE4X 用の XMLBEANS_LIB/lib 以下の jar ファイルを Windows のパスに変換して設定し export
  3. 引数の設定
    • -dオプションがあったらデバッグとみなして、java のバージョンと classpath 設定を出力して終了
    • もし、ファイルだったら Windows のパスに変換
  4. 最後に java を実行

実行

$ rhino -d
=== Debug mode ===
java version "1.6.0_01"
Java(TM) SE Runtime Environment (build 1.6.0_01-b06)
Java HotSpot(TM) Client VM (build 1.6.0_01-b06, mixed mode, sharing)
=== CLASSPATH ===
.
d:\usr\java\rhino1_6R5\js.jar
d:\usr\java\XMLBEA~1.0\lib\JSR173~1.JAR
d:\usr\java\XMLBEA~1.0\lib\resolver.jar
d:\usr\java\XMLBEA~1.0\lib\xbean.jar
d:\usr\java\XMLBEA~1.0\lib\XBEAN_~1.JAR
d:\usr\java\XMLBEA~1.0\lib\XMLPUB~1.JAR

$ cat ~/jstest

print('Hello World !')

$ rhino -f ~/jstest
Hello World !
$ rhino
Rhino 1.6 release 5 2006 11 18
js> print('Hello World !')
Hello World !
js> var a = <root>
<x name="hoge">10</x>
<y>20</y>      
<x>400</x>
</root>
js> a
<root>
  <x name="hoge">10</x>
  <y>20</y>
  <x>400</x>
</root>
js> a.x
<x name="hoge">10</x>
<x>400</x>
js> for ( var i in a.x ){ print( i + ': ' + a.x[i] ) }
0: 10
1: 400
js> a.x[0]
10
js> a.x[0].@name
hoge