Python внутри Java с использованием Spring Integration. Ошибка: javax.script.ScriptEngineManager не может создать механизм сценариев для языка 'python' - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь запустить программу на Python внутри Java, используя Spring Integration Framework.Я перепробовал много вещей, и я довольно озадачен.Если у кого-то есть идеи, что делать, это было бы весьма признательно.Спасибо

Я на MacOS, использую IntelliJ IDEA и Spring 5. Я получил некоторый код из другой проблемы на SO, чтобы показать, какой scriptengine поддерживается в системе, и увидел, что без Jython я не видел Python.Но затем, даже увидев, что это в моей системе, «ScriptExecutor executor = ScriptExecutorFactory.getScriptExecutor (« python »)» все еще возвращает исключение java.lang.IllegalArgumentException: javax.script.ScriptEngineManager не может создать механизм сценариев для языка «python».».Это может быть связано с отсутствующей языковой реализацией или неверным именем языка.

Вот полный код тестового класса:

import org.springframework.integration.scripting.ScriptExecutor;
import org.springframework.integration.scripting.jsr223.ScriptExecutorFactory;
import java.util.List;
import javax.script.ScriptEngineManager;
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);
        }

        ScriptExecutor executor = ScriptExecutorFactory.getScriptExecutor("python");  //jython gives same result
        //ScriptSource source = new ResourceScriptSource(new ClassPathResource("message.py"));
        //executor.executeScript(source);


    }

}

Это вывод из консоли:

ScriptEngineFactory Info
    Script Engine: Oracle Nashorn (1.8.0_151)
    Engine Alias: nashorn
    Engine Alias: Nashorn
    Engine Alias: js
    Engine Alias: JS
    Engine Alias: JavaScript
    Engine Alias: javascript
    Engine Alias: ECMAScript
    Engine Alias: ecmascript
    Language: ECMAScript (ECMA - 262 Edition 5.1)
ScriptEngineFactory Info
    Script Engine: jython (2.7.0)
    Engine Alias: python
    Engine Alias: jython
    Language: python (2.7)
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/Users/mkirouac/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/mkirouac/.m2/repository/org/slf4j/slf4j-log4j12/1.7.26/slf4j-log4j12-1.7.26.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
Exception in thread "main" java.lang.IllegalArgumentException: javax.script.ScriptEngineManager is unable to create a script engine for language 'python'.
This may be due to a missing language implementation or an invalid language name.
    at org.springframework.util.Assert.notNull(Assert.java:198)
    at org.springframework.integration.scripting.jsr223.AbstractScriptExecutor.<init>(AbstractScriptExecutor.java:57)
    at org.springframework.integration.scripting.jsr223.PythonScriptExecutor.<init>(PythonScriptExecutor.java:41)
    at org.springframework.integration.scripting.jsr223.ScriptExecutorFactory.getScriptExecutor(ScriptExecutorFactory.java:29)
    at Test.main(Test.java:37)

Process finished with exit code 1
...