通过 JSR-223 执行动态 Java 代码

Executing dynamic Java code over JSR-223

一段时间以来,我一直在通过 JSR-223 在我的应用程序中执行动态代码。基本逻辑是:

ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName(engineName);
final CompiledScript compiled = ((Compilable) scriptEngine).compile(script);
Bindings bindings = scriptEngine.getBindings(ScriptContext.ENGINE_SCOPE);
bindings.put("key", value);
compiled.eval(bindings);

这对 Nashorn 和 Groovy 脚本引擎非常有效。然而,如果扩展应用程序的逻辑不需要了解另一种语言的语法和技巧,那就太好了——毕竟基本代码在 Java 中。

在列出内置引擎时,Java 似乎没有:

ScriptEngineManager manager = new ScriptEngineManager();
List<ScriptEngineFactory> factoryList = manager.getEngineFactories();
for (ScriptEngineFactory factory : factoryList) {
    log.debug(factory.getLanguageName());
}

我发现了一些动态 Java 库,但它们似乎不再被维护。我想可以使用 javax.tools.JavaCompiler 一起写一些东西,但我希望我可能遗漏了一些基本的东西,并且已经存在针对这种东西的可行选择。我也知道 Java9 中关于 jshell 的基础知识,但我没有听说过它允许使用 ScriptEngineManager 执行代码。

我应该如何使用 Java 语言本身来实现脚本?除了在 javax.tools.JavaCompiler 的帮助下开始实施我自己的 javax.script.ScriptEngine 之外,还有其他选择吗?

你在#java9看到JShell tool and API了吗?它不是基于 JSR-223 的——尽管如此 Java API(和命令行工具)使用 Java 作为 "scripting language".

查看 SciJava Java Scripting plugin

文档有点单薄。见 Maven Repository and note that the resolver is the ImageJ Releases repository (http://maven.imagej.net/content/repositories/releases/)

我来晚了一点,但我刚刚发布了 jshell-scriptengine 的 1.1.0 版。

看看看看: https://github.com/eobermuhlner/jshell-scriptengine