Java脚本API无法按名称检索引擎

Java脚本API无法按名称检索引擎,java,scripting,jython,rhino,Java,Scripting,Jython,Rhino,我试图找到已安装的带有Java脚本API的脚本引擎,但出现了一些问题 在这个演示程序中,我使用ScriptEngineManager检索工厂并列出我拥有的所有引擎。之后,我尝试按名称获取它,但结果为空 public class App { public static void main(String[] args) { ScriptEngineManager manager = new ScriptEngineManager(); List<ScriptEngineF

我试图找到已安装的带有Java脚本API的脚本引擎,但出现了一些问题

在这个演示程序中,我使用ScriptEngineManager检索工厂并列出我拥有的所有引擎。之后,我尝试按名称获取它,但结果为空

 public class App {
  public static void main(String[] args) {
    ScriptEngineManager manager = new ScriptEngineManager();
    List<ScriptEngineFactory> factories = manager.getEngineFactories();

    for (ScriptEngineFactory factory : factories) {
        System.out.println("\nName : " + factory.getEngineName());
        System.out.println("Version : " + factory.getEngineVersion());
        System.out.println("Language name : " + factory.getLanguageName());
        System.out.println("Language version : " + factory.getLanguageVersion());
        System.out.println("Extensions : " + factory.getExtensions());
        System.out.println("Mime types : " + factory.getMimeTypes());
        System.out.println("Names : " + factory.getNames());
        ScriptEngine engine = manager.getEngineByName(factory.getEngineName());
        if (engine == null) {
            System.out.println("Impossible to find the engine with name " + factory.getEngineName()+"\n");
        }

    }
   }
 }
公共类应用程序{
公共静态void main(字符串[]args){
ScriptEngineManager管理器=新建ScriptEngineManager();
List factories=manager.getEngineFactorys();
用于(ScriptEngineFactory工厂:工厂){
System.out.println(“\n名称:+factory.getEngineName());
System.out.println(“版本:+factory.getEngineVersion());
System.out.println(“语言名称:+factory.getLanguageName());
System.out.println(“语言版本:+factory.getLanguageVersion());
System.out.println(“扩展:+factory.getExtensions());
System.out.println(“Mime类型:+factory.getMimeTypes());
System.out.println(“名称:“+factory.getNames());
ScriptEngine=manager.getEngineByName(factory.getEngineName());
如果(引擎==null){
System.out.println(“无法找到名为“+factory.getEngineName()+”\n”的引擎);
}
}
}
}
结果是:

版本:1.7发行版3预发行版

语言名称:ECMAScript

语文版本:1.8

扩展:[js]

Mime类型:[应用程序/javascript,应用程序/ecmascript,文本/javascript,文本/ecmascript]

名称:[js,rhino,JavaScript,JavaScript,ECMAScript,ECMAScript]

无法找到名为Mozilla Rhino的引擎


姓名:jython

版本:2.7.0

语言名称:python

语文版本:2.7

扩展:[py]

Mime类型:[text/python,application/python,text/x-python,application/x-python]

名称:[python,jython]

无法找到名为jython的引擎


检查
ScriptEngineFactory
getnames()
方法的文档:

返回ScriptEngine的不可变短名称列表,ScriptEngineManager可使用该列表标识ScriptEngine

也就是说,必须使用以下名称之一:

...
System.out.println("Names : " + factory.getNames());
ScriptEngine engine = manager.getEngineByName(factory.getNames().get(0));
...

它适用于第一个引擎Mozila Rhino,但不适用于Jython引擎,使用factory.getNames()是一个解决方案。好吧,我不明白的是,为什么它适用于一个而不适用于另一个,我应该在我的机器上安装一些东西(解释器)来让Jython工作吗?非常奇怪,对不起,我没有/使用Jython-我不知道它必须如何安装您可以尝试通过
getEngineBymetype(“text/python”)
获取引擎,也可以尝试
factory.getScriptEngine()