JavaScript引擎支持的语言

28

Java拥有一个ScriptEngine系统,允许您在不同的语言中运行/评估语句。
我知道JavaScript得到支持,但我找不到任何其他可以与其一起工作的语言。
例如,Ruby是否被实现了?

5个回答

17

以下是一个用来确定系统中所有语言的脚本:

import java.util.List;
import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.Bindings;
import javax.script.ScriptContext;
import javax.script.ScriptEngineFactory;


public class Test {

public static void main(String[] args)
{
    ScriptEngineManager mgr = new ScriptEngineManager();
    List<ScriptEngineFactory> factories = mgr.getEngineFactories();
    for (ScriptEngineFactory factory : factories)
    {
        System.out.println("ScriptEngineFactory Info");
        String engName = factory.getEngineName();
        String engVersion = factory.getEngineVersion();
        String langName = factory.getLanguageName();
        String langVersion = factory.getLanguageVersion();
        System.out.printf("\tScript Engine: %s (%s)\n", engName, engVersion);
        List<String> engNames = factory.getNames();
        for (String name : engNames)
        {
            System.out.printf("\tEngine Alias: %s\n", name);
        }
        System.out.printf("\tLanguage: %s (%s)\n", langName, langVersion);
        }
    }

}

希望这能有所帮助。


12

我知道JavaScript得到支持,事实上使用的是技术上的ECMAscript

但我找不到其他语言能够与它一起使用。比如说,Ruby被实现了吗?

没有。据我所知,默认情况下只包含ECMAscript引擎。

更新

Pointy的评论表明,Nashorn引擎已经被弃用,并将很快被移除。


1
即使是通常随JRE一起提供的JavaScript版本也不是必需的,并且您应该对跨版本的兼容性有较低的期望。 - McDowell
2
请注意JavaScript支持已被弃用,将在JDK/JVM的第13个版本中消失。 - Pointy
2
我在工作中使用JDK 11(我们非常保守),是个“金丝雀”,我们的构建过程使用了一些基于Nashorn的JavaScript,运行时会输出“它即将消失”的消息。我认为我读到过他们从依赖JavaScript支持的人那里得到的反馈很少,所以它已经从路线图中删除了。 - Pointy
1
我记得就在几年前,Nashorn曾经是一个非常重要的问题;我在Strange Loop会议上看到过有关架构的演示。我想他们决定这是一种资源浪费(按照他们的价值计算)。 - Pointy
3
自Java 15起,Nashorn引擎不再是JDK的一部分。随着该引擎被弃用,据我所知,JDK中不再包含脚本引擎。引擎SPI得到支持,只是内置的示例实现不再存在。 - Peter Verhas
显示剩余4条评论


8
Java ScriptEngine API可以与所有JSR-223脚本语言一起使用。我之前没有找到过一个完整的、有良好文档支持的列表,但是这篇文章做得相当不错, Where can I find a list of available JSR-223 scripting languages? 以下是该文章中的一个列表,
JSR-223脚本引擎
• AWK • BeanShell • ejs • FreeMarker • Groovy • Jaskell • Java • JavaScript • JavaScript(Web浏览器) • Jelly • JEP • Jexl • jst • JudoScript • JUEL • OGNL • Pnuts • Python • Ruby • Scheme • Sleep • Tcl • Velocity • XPath • XSLT
其他维护的JSR 223脚本引擎
• JavaFX Script • ABCL • AppleScript • Bex script • OCaml Scripting Project • PHP • PHP(另一个) • Python • Smalltalk • CajuScript • MathEclipse 大多数需要特殊实现才能正常工作。例如,单独使用Python将无法工作,您需要将Jython jar添加到类路径中。同样,对于Ruby,您需要JRUBY。

Scala 也被支持了,我想是吧? - Nicofisi
ScriptEngine语言是通过java.util.ServiceLoader机制(服务发现/服务提供程序接口)进行自注册的。这意味着在META-INF\services库中创建了一个文件,指向ScriptEngineFactory接口的实现。这取决于特定语言是否将其添加到脚本语言的“核心”jar中,或者是否通过单独的jar完成此操作。例如,beanshell将其添加到核心org.apache-extras.beanshell:bsh jar中,自2.0版本以来。将此jar添加到类路径即可在ScriptEngine中使用。 - slindenau

5

还有一些其他的语言可供选择。例如,Jython(Java中的Python实现)。使用其他语言的方法是将JAR文件添加到CLASSPATH并引用正确的名称。

对于Ruby,有JRuby。请参见以下内容:https://github.com/jruby/jruby/wiki/JavaIntegration

ScriptEngineManager m = new ScriptEngineManager();
ScriptEngine rubyEngine = m.getEngineByName("jruby");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接