Java の JSR-223 実装を試す

  • 2
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

概要

皆さんは JSR-223 をご存知でしょうか?Java で Script 言語のコードを動かす実装に関する仕様で、それだけ聞くとなかなか夢を広げるアイデアです。例えば、 Java の標準には JavaScript を動かすための ScriptEngine が含まれており、それを使えば Java と既存の JavaScript コードを移植作業なしに連携させることが可能です。興味深い多言語のライブラリがあるとき、まずはこの ScriptEngine を使って連携を確かめ、有用であると判断できたら移植する、という使い方にも適します。

実装されていた JSR-223 実装の一覧は https://java.net/projects/scripting/sources/svn/show/trunk/engines/java?rev=236 で見ることができます。なお、最終更新から10年近く経ったものもあり、置き去り感がたまらないです。

Java

この JSR-223 の中には Java に対するものもあったようです。残念ながら標準に組み込まれることはなく、今も svn で眠っているようです。Java のソースコードを与えて実行できるというと、Java9から登場する JShell を思い出します。Early Access をダウンロードすれば今すぐ使えるのに、今更できることの限られている Java の JSR-223 を引っ張り出す意味がどこまであるのかは不明ですが、暇つぶしになればと思ってやってみました。

ビルド

ソースコードをダウンロードしてビルドするのが最も楽でしょう。今回は Gradle を使ってjarを作り、それをビルドパスに含めて使いました。

使う

Java8 の動く環境であれば Lambda も Stream API も使えます。

Script.java
package com.sun.script.java;

import javax.script.ScriptEngine;
import javax.script.ScriptException;

public class Script {
    public static void main(final String[] args) {
        final String script = "import java.util.*;"
                + "class Hello {"
                + "public static void main(final String[] args) {"
                + "StringBuilder sb = new StringBuilder();"
                + "Arrays.asList(\"h\", \"e\", \"l\", \"l\", \"o\").forEach(c -> {sb.append(c);});"
                + "System.out.println(sb.toString());}}";
        final ScriptEngine engine = new JavaScriptEngineFactory().getScriptEngine();
        try {
            final java.lang.Object run = engine.eval(script);
        } catch (final ScriptException e) {
            e.printStackTrace();
        }

    }
}

仕方ないことではありますが、「JavaScriptEngineFactory」 という名前だと Java のものなのか JavaScriot のものなのかわかりにくいです。今回のは Java の ScriptEngineFactory です。
Script として渡すコードの Main Class を public で宣言すると、ファイル名と Main クラスの名前が一致しないと言われコンパイルエラーとなります。

実行結果
hello

何がうれしいのか?

プラグイン的な仕組みを実装したり、Java 学習用のアプリケーションを開発するのに利用したり、簡単な検証用のコードを動かすのに役立ちそうです。おや、JShell の用途と大分重なっていますね……

結論

  1. Java の軽い検証には JShell を使いましょう(Open JDK9 Early Access)
  2. Java の文法で Script を書きたいなら Groovy を使うとよいでしょう
  3. Java 以外の言語で記述されたライブラリと Java の連携を急ぎで確かめたい場合には有用です

参考

  1. Original Project
  2. 今回のソース全体(GitHub repository)

手前味噌

以前、JavaFX と ScriptEngine を組み合わせたアプリケーションを開発したことがあります。
1. JavaFX と ScriptEngine を組み合わせた学習用アプリケーションを作る
2. 上記アプリケーションの repository……現在は Jython/JavaScript/Groovy/Clojure に対応しています。


おまけ

リポジトリにあった他の JSR-223 にどんなものがあったかをまとめてみました。まったく知らない言語がたくさんあって世の中の広さと歴史の重みを感じます。

jsr-223 project comment license latest author revision latest modified log entry
beanshell JavaVM上で動作するスクリプト言語 3-clause BSD sundararajana 153 over 9 years ago Changed StringBuffer to StringB...
browserjs native JavaScript engine embedded in web browsers 3-clause BSD sundararajana 153 over 9 years ago Changed StringBuffer to StringB...
ejs Embedded JavaScript language 3-clause BSD sundararajana 88 over 9 years ago Fixed license text in all LICEN...
freemarker Freemarker general purpose template engine in Java 3-clause BSD / LGPL sundararajana 192 over 8 years ago * Updated README.TXT files to re...
groovy Groovy 3-clause BSD / BSD ceefour 228 almost 8 years ago Added Bundle-Version manifest to...
jacl Tcl (Tool Command Language)のJava実装 3-clause BSD / BSD sundararajana 155 about 9 years ago Added a note on accessing/updat...
jaskell Haskell の Java 実装、これ以上新しいコードは行方不明 3-clause BSD BSD sundararajana 153 over 9 years ago Changed StringBuffer to StringB...
java Java 3-clause BSD sundararajana 153 over 9 years ago Changed StringBuffer to StringB...
javascript JavaScriot 3-clause BSD / MPL sundararajana 192 over 8 years ago * Updated README.TXT files to re...
jawk AWK の Java 実装 3-clause BSD / GPL sundararajana 153 over 9 years ago Changed StringBuffer to StringB...
jelly ??? 3-clause BSD / Apache License Version 2.0 sundararajana 136 over 9 years ago * Made makefile changes to buil...
jep Java Math Expression Parser 3-clause BSD / GPL sundararajana 153 over 9 years ago Changed StringBuffer to StringB...
jexl ??? 3-clause BSD / Apache License Version 2.0 sundararajana 153 over 9 years ago Changed StringBuffer to StringB...
jruby Ruby の Java 実装 3-clause BSD / under a tri CPL/GPL/LGPL license yokolet 234 over 7 years ago updating JRuby engine samples
jst JavaScript templates 3-clause BSD / Apache License, Version 2.0 sundararajana 88 over 9 years ago Fixed license text in all LICEN...
judo JudoScript 3-clause BSD / LGPL sundararajana 153 over 9 years ago Changed StringBuffer to StringB...
juel Java Unified Expression Language (JSP EL 2.1 JSR-245) 3-clause BSD / Apache License Version 2.0 sundararajana 153 over 9 years ago Changed StringBuffer to StringB...
jython Python の Java 実装 3-clause BSD / Python Software Foundation License version 2 sundararajana 192 over 8 years ago * Updated README.TXT files to re...
ognl Object Graph Navigation Language 3-clause BSD / BSD sundararajana 153 over 9 years ago Changed StringBuffer to StringB...
pnuts pnuts 言語 3-clause BSD tomatsu 174 almost 9 years ago Issue number: Obtained from: Sub...
scheme Scheme の Java 実装 3-clause BSD / Mozilla Public License Version 1.1 sundararajana 158 about 9 years ago Changed to use SISC version 1.1...
velocity Java のテンプレートエンジン 3-clause BSD / Apache License Version 2.0 sundararajana 163 about 9 years ago Changed to use Velocity 1.5 ver...
xpath XPath 3-clause BSD sundararajana 153 over 9 years ago Changed StringBuffer to StringB...
xslt XSLT 3-clause BSD sundararajana 136 over 9 years ago * Made makefile changes to buil...

この表に名前はありませんが、 Clojure や Scala にも JSR-223 実装があります。

参考

  1. Java オブジェクトを操作するスクリプト言語比較