Rhino実行環境構築からJavaのcommons-langライブラリを呼び出してみる

2019-02-28Java, JavaScript

以下のフレームワークを使用した開発が一段落した。

次の案件の調査開始。
intra-mart というサーバサイドJavaScriptのパッケージカスタマイズ。

クライアントサイドもJavaScriptでゴリゴリコーディング。
いっそ開発支援用のスクリプトもJavaScriptで書いてしまおうとRhinoをセットアップ。

セットアップ

Rhino のダウンロード から、Rhinoのパッケージをダウンロード。
解凍したフォルダ内のjs.jarを適当な場所に置くのだが、Groovyに似せて ~/.rhino/lib に配置してみた。

加えてパスの通った場所に以下のようなBashスクリプトを配置。

rhino

$ echo <<'EOF' >rhino
#!/usr/bin/env bash
libs=""
for f in $(\ls ~/.rhino/lib/*.jar); do
  libs=$libs:$f
done
java -cp $libs org.mozilla.javascript.tools.shell.Main "${@}"
EOF
$ chmod 755 rhino

実行

早速実行してみる。

test1.js

#!/usr/bin/env rhino
print('test')
# 先程作成した `rhino` スクリプトの引数にJavaScriptファイルを渡すと実行可能
$ rhino test1.js
test
# 実行権限を付与すれば、ファイルを指定して実行可能
$ chmod 700 ./test1.js
$ ./test1.js
test

おお!思った以上に実行速度が早くてびっくりした。

commons-lang を呼んでみる。

commons-lang も呼んでみる。

  1. まずはjarをダウンロード
  2. ゲットした commons-lang-2.4.jar~/.rhino/lib ディレクトリに配置
  3. 以下のようなスクリプトを作成し、実行してみる。

test2.js

#!/usr/bin/env rhino
importPackage(Packages.org.apache.commons.lang)
var list = ['1', '2', '3']
var text = StringUtils.join(list, ':')
print(text)
$ rhino test2.js
1:2:3
$ chmod 700 ./test2.js
$ ./test2.js
1:2:3

あ、結構いいかも。気に入ってきた。

test3.js

#!/usr/bin/env rhino
importPackage(Packages.org.apache.commons.lang)
var list = [1, 2, 3]
list.each = function (f) {
  for (var i = 0; i < list.length; i++) f(list[i])
}
list.each(function (el) {
  print("[" + StringUtils.center(el * 2, 10) + "]")
})
# スペース10文字の中央に表示される
$ ./test3.js
[    2     ]
[    4     ]
[    6     ]

追記

~/.rhino/lib にjarファイルを置いていないときは早い。ここに配置するjarファイルが増えるごとにかなりもっさりしてくる。
Groovyの重さも同じような原因か?

2019-02-28Java, JavaScript