概要
皆さんは 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 も使えます。
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 の用途と大分重なっていますね……
結論
- Java の軽い検証には JShell を使いましょう(Open JDK9 Early Access)
- Java の文法で Script を書きたいなら Groovy を使うとよいでしょう
- Java 以外の言語で記述されたライブラリと Java の連携を急ぎで確かめたい場合には有用です
参考
手前味噌
以前、JavaFX と ScriptEngine を組み合わせたアプリケーションを開発したことがあります。
- JavaFX と ScriptEngine を組み合わせた学習用アプリケーションを作る
- 上記アプリケーションの 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 実装があります。