NashornからRhinoへの移行

概要

【追記】まだ課題あり。saiを使ってください。by jflute (2021/09/02)

LastaFluteでNashornを使ってるところ

Java組み込みのJavaScriptエンジン Nashorn というものがあります。

LastaFluteでは、以下の状況で使っています。

LastaFlute向けのFreeGen
LastaDocやRemoteApiGenで使っている (JSONの書き出しなど)
Lasta Di の Di xml
複雑なスクリプト表現で使っている

NashornがJava15から外された

ですが、その Nashorn が Java15 より外されて、デフォルトでは利用できません。

(なので、Java15以上の環境で、FreeGenを実行したり、Lasta Di を起動したりすると落ちます)

RhinoがJavaScript Engineをサポート

Nashornが非推奨になったことを受けて、Mozilla Foundationが提供している Rhino が、Javaにおける JavaScript Engine をサポートしました。今後はそれを利用していくことをオススメしています。

Github
https://github.com/mozilla/rhino

(Nashornをforkしたsaiもありますが、状況回避的なforkであるためJavaScriptの進化への追従などが厳しいですし、 DBFluteにとってライセンス的にも扱いやすいRhinoがサポートしたということから)

ただし、Lasta Di, DBFluteを最新に

ただ、NashornとRhinoで少し挙動や仕様が違う部分がありましたので、Lasta Di や DBFlute Engineにて (できる範囲で) その違いを吸収するようにしています。

ゆえに、Rhinoが利用できるのは、それぞれ以下のバージョン以降になります。

Lasta Di
@since 0.8.5
DBFlute Engine
@since 1.2.5 patch 2021/09/01

もし、上記のバージョンにアップグレードできない環境で、かつ、Java15以降となる場合は、Nashornをforkしたsaiを利用することになります。

FreeGen環境のRhino移行

以下のような流れで移行できます。

  1. DBFlute を 1.2.5 patch 2021/09/01 以上にアップグレードする
  2. manageタスクの 31 (sai) を実行して jarファイルたちをextlibにダウンロードする

DBFlute-1.2.5 patch 2021/09/01 より

DBFlute-1.2.5 patch 2021/09/01 より、クラスパスに Rhino が存在すれば Rhino を利用するようにしました。 (また、若干のRhinoに合わせた対応もしています)

なので、まずはDBFluteを最新版にアップグレードをしましょう。

manageタスクの 31 (sai) で extlib にダウンロード

manageタスクにて、sai (31) を実行しましょう。

すると、DBFluteクライアントの extlibディレクトリ配下に Rhino のjarファイルたちがダウンロードされます。 (RhinoのバージョンはDBFlute Engineのバージョンごとに固定です)

e.g. DBFluteクライアントの extlib に rhino を配置、ドキュメント執筆時の最新版 @Directory
dbflute_maihamadb
 |-dfprop
 |-...
 |-extlib
 |  |-rhino-1.7.13.jar
 |  |-rhino-engine-1.7.13.jar
 |-...
 |-log

これにて、FreeGen を実行できるようになります。

jarをgitにコミットするかしないか?

どちらも大丈夫です。プロジェクトの都合に合わせましょう。

gitにコミットする
他の人は配置作業せずにFreeGenが実行できる
gitignoreにする
他の人もダウンロードして配置する必要あるが、gitは軽くなる

もし、手作業ダウンロードするのであれば

もし、Rhinoの最新版を使いたいなどで、手作業ダウンロードするのであれば、 mvnrepository のサイトにjarファイルへのダウンロードリンク (Files の jar) が貼られていますので、そこからそれぞれダウンロードすることができます。

rhino
https://mvnrepository.com/artifact/org.mozilla/rhino
rhino-engine
https://mvnrepository.com/artifact/org.mozilla/rhino-engine

※バージョンや依存関係に注意

関連するDBFlute Engineのソースコードは?

内部的な挙動を確認したい場合の参考として、DBFlute Engineのソースコードで関連する主なクラスは、DfFrgJavaScriptJsonEngineとなります。

Lasta DiのRhino移行

いま起動しても落ちないのであれば?

まず、Java15以降でLastaFluteのプロジェクトを起動して落ちていないのであれば、ひとまず移行はしなくても良いかもしれません。

Lasta Di の新しいバージョンでは、Lasta Di内部で使っている Di xml では、JavaScript表現を使わないように修正されています。 なので、アプリケーションの中の Di xml でJavaScript表現を使わない限り Rhino を入れる必要はありません。

Di xmlは起動時にすべて読み込まれますから、起動して落ちていないということはアプリケーションでも使っていない可能性が高いです。 そもそも、Di xml でJavaScript表現を使うことは稀です。

いま起動で落ちるのであれば?

まずは、Lasta Di (LastaFlute) を最新版にアップグレードしましょう。

先の通り、Lasta Di の新しいバージョンでは、内部の Di xml でJavaScript表現を使わないようにしているので、アップグレードするだけで解決するかもしれません。

アップグレードしても落ちる(アプリでJavaScript表現を使っている)、もしくは、アップグレードがどうしてもできないのでれば Rhino を入れましょう。

Rhinoを依存ライブラリに追加

例えば Maven であれば、pom.xmlにsaiのdependencyを追加します。

e.g. pom.xmlにRhinoのdependencyを追加、ドキュメント執筆時の最新版 @Xml
<!-- javascript engine (instead of nashorn) -->
<dependencies>
    <dependency>
        <groupId>org.mozilla</groupId>
        <artifactId>rhino-engine</artifactId>
        <version>1.7.13</version>
    </dependency>
</dependencies>

これにて Lasta Di は、JavaScript表現が必要なときに Rhino を使うようになります。 (Rhinoがクラスパスに存在していれば、自動的に Rhino を使うようになります)

関連するLasta Diのソースコードは?

Lasta Diのソースコードで関連する主なクラスは、JavaScriptExpressionEngineです。

念のため、ライセンスに注目

Rhino は Mozilla Public License Version 2.0 です。

改変などしない限りは制約の少ないライセンスではありますが、一応しっかり知っておきましょう。