jjs

jjsを使う

先日まで、java7サーバで作業していたため、jrunscriptを利用していたけれども、
これから使うサーバはjava8。なのでjjsを利用する。

jjsでは新たなメソッドが定義されている。
なお、下記のメソッドを利用するためには、jjsをscriptingモードで実行する必要がある。
scriptingモードで実行するためには、2つの方法がある。

jjsの引数に-scriptingを指定する。

下記の通りスクリプトを呼び出す。

1
$ jjs -scrpting my-script.js

スクリプトファイルの先頭にShebangを書く。

上記のmy-script.jsの先頭行にShebangを書く。

1
2
3
4
#!/usr/bin/env jjs

print('my script start!');
//

Shebangが書かれているスクリプトは、jjsの引数に-scriptingを指定しなくても、
自動的にscriptingモードで実行される。
Windowsでjjsを動かす場合も、特に気にせずShebangを書けば良い。
しかし、WindowsではShebangは利用されないので、1行目に#のみ書いておけば良い。

scriptingモードでの便利機能

  • ヒア・ドキュメント
  • グローバルオブジェクト
  • コマンド実行
  • readFully()

ヒア・ドキュメント

scriptingモードではヒアドキュメントを利用できる。
sqlを格納したいときなど便利。

1
2
3
4
5
6
var sql = <<"SQL";
SELECT
    *
FROM
    TAB
SQL

グローバルオブジェクト

$ARG配列を参照することで、スクリプトの引数を参照できる。
なお、argumentsからでも同様に取得することができる。

$ENVオブジェクトを利用することで、環境変数を取得することができる。

1
2
print($ENV.ORACLE_HOME);
print($ENV['ORACLE_HOME']);

コマンド実行

$EXEC(‘ls -l’)を利用することで、ls -lを実行できる。
なお、出力される標準出力は$OUTに入っている。戻り値にも標準出力に入っている。エラー出力は$ERRに入る。
終了コードは$EXITに入る。
なお、コマンド呼び出しに失敗すると例外が飛ぶ。
コマンドを呼び出し、$EXITや$OUTを解析することで、ジョブ実行判定などができる。

readFully()

テキストファイルを読み込んで、変数に収めることができる。

1
2
var text = readFully('my-data.txt');
print(text);

テキスト読み込みが簡単にできる。当然、java.ioやjava.nioを利用して読み込んでも良い。

java8からnashornなので

java7のRhinoでは、Listをfor eachしても、Listオブジェクトのメソッドが取得できるだけだった。
java8のNashornでは、Listの中身でeachする。

1
2
3
4
5
6
7
8
9
10
11
var list = new java.util.ArrayList();
list.add('apple');
list.add('banana');
for (var i in list) {
    print(list[i]);
}
// listの中身が欲しいとき
var ite = list.iterator();
while (ite.hasNext()) {
    print(ite.next());
};

上記のスクリプトをjava7のjrunscriptで実行すると、forループではArrayListのメソッドリストが出力され、whileループでapple,bananaが出力される。
java8のjjs(jrunscript)では、forループもwhileループもapple,bananaが出力される。

無駄にイテレーターを作らなくても良いので、本来の実装のみに力を注ぐ事ができる。

注意

Nashornになり、importPackage()とimportClass()が廃止されている。
今後は、Java.type()を利用することになる。

1
2
3
4
var ArrayList = Java.type('java.util.ArrayList');
var list = new ArrayList();
list.add('Apple');
list.add('Banana');

JavaImporterは従来通り利用できる。
どうしてもimportPackage()、importClass()を利用したい場合は、組み込み互換性スクリプトをロードする。

1
2
3
4
5
load('nashorn:mozilla_compat.js');
importClass(java.util.ArrayList);
var list = new ArrayList();
list.add('Apple');
list.add('Banana');
同じタグの記事
同じカテゴリの記事

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA