ほんじゃーねっと

おっさんがやせたがったり食べたがったりする日常エッセイ

Nashornスクリプト実行時のクラスパス設定を容易にするためにNasven.jsを使う

Nashornというのは、Java8に同梱されている新しいJavascriptエンジンで、 Javaライブラリを呼び出して利用するJavascriptプログラムを作成することができる。 Node.jsで適当なライブラリが見つからない場合やJavaライブラリに精通していて ちょっとしたスクリプトを作成したい場合の良い選択肢になりそうだ。

Java8環境をインストールしたら標準で付属してくる「jjs」コマンドを使うことで 作成したNashornスクリプトを実行することができる。

Javascriptの言語仕様に加えて、いくつかJavaクラスを呼び出すための関数が 追加されている。Node.jsでnpmライブラリをrequireする感覚でJavaのライブラリを 呼び出せるようになる。

詳細は下記のユーザーガイド参照: Nashorn User's guide https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/

ここからが今回の本題。

NashornスクリプトはJavaのクラスと同じ扱いなので Apache Projectや自作のJar等の標準以外のJavaライブラリを使おうとすると、 当然ながらクラスパスにそのJarファイルを追加して実行する必要がある。

jjsコマンドにはclasspathオプションがあり、ここでjarファイルを指定すれば それで実行できるのだけど、多くのjarファイルを使用している場合などは 毎回classpathを指定するのが面倒で、せっかくコンパイル無しでサクッと 実行できるのだからクラスパス指定ももっと簡単にしたい。

と思って探してみたら、「Nasven.js」(Nashorn + Maven + .js)というスクリプトが 公開されてた。これを使うとMavenと同じ感じでビルドファイルを作成しておき、 そこでクラスパス等のビルド情報を記述しておくことができる。

詳細は下記の記事参照: Nashorn Maven: Easy Library Classpath Setup https://blogs.oracle.com/brunoborges/entry/nashorn_maven_easy_library_classpath

試しにApache POIを使用するスクリプトを作ってみたら、うまく動作した。

nasven.jsを使用するNashornスクリプトの入手から作成・実行までの手順:

  1. Githubからnasven.jsをダウンロード
  2. nasven.jsようのビルドファイル(例:app1.mvn)を作成する
  3. メインのNashornスクリプトを作成する
  4. nasven.js経由でNashornスクリプトを実行する

ビルドファイルの例:

app1.mvn

var maven = { 
    main: 'app1.js',
    options: '-scripting',
    dependencies: [
      'org.apache.poi:poi:3.11',
      'org.apache.poi:poi-ooxml:3.11',
      'org.mongodb:mongo-java-driver:3.0.0'
    ]   
};

Nashornスクリプトの例:

app1.js

var Biff8EncryptionKey = Java.type('org.apache.poi.hssf.record.crypto.Biff8EncryptionKey');
var WorkbookFactory = Java.type('org.apache.poi.ss.usermodel.WorkbookFactory');
var XSSFWorkbook = Java.type('org.apache.poi.xssf.usermodel.XSSFWorkbook');
var MongoClient = Java.type('com.mongodb.MongoClient');
...

Nashornスクリプトを実行する(Linux環境の場合):

$ nashven.js -- app1.mvn

Windows7環境では下記のようにコマンドを変更したら動作した。

Nashornスクリプトを実行する(Windows環境の場合):

$ jjs -scripting nashven.js -- app1.mvn

Maven Centralからのライブラリのダウンロードも自動化されるので、 スクリプトの作成から実行までの手間が軽減され、手軽に使用できるようになった。

Apache Maven 3クックブック Javaソフトウェア開発のための特選レシピ集

Apache Maven 3クックブック Javaソフトウェア開発のための特選レシピ集