Java
jsr223

Java の JSR-223 実装を試す

More than 1 year has passed since last update.


概要

皆さんは 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 オブジェクトを操作するスクリプト言語比較