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 をサポートしました。今後はそれを利用していくことをオススメしています。
(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移行
以下のような流れで移行できます。
- DBFlute を 1.2.5 patch 2021/09/01 以上にアップグレードする
- 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 です。
改変などしない限りは制約の少ないライセンスではありますが、一応しっかり知っておきましょう。