首页 > 解决方案 > 通过 javax.script 在 Java 中编写脚本:无法检索 Python 的 ScriptEngine

问题描述

我有一个小 maven 项目来学习使用 javax.script API 编写 Java 脚本,即 JavaScript 和 Python。虽然 JavaScript 运行良好,例如在这个方法中

@Test
public void TestPrintHelloWorldJs() throws ScriptException {
    ScriptEngineManager factory = new ScriptEngineManager();
    ScriptEngine engine = factory.getEngineByName("nashorn");
    
    engine.eval("print('Hello, World')"); // works
}

我根本无法运行 python,因为返回的引擎始终为空:

@Test
public void TestPrintHelloWorldPy() throws ScriptException {
    ScriptEngineManager factory = new ScriptEngineManager();
    ScriptEngine engine = factory.getEngineByName("python"); // returns null !!!
    engine = factory.getEngineByName("jython"); // still returns null !!!

    engine.eval("print('Hello, World')"); // NullPointerException here
}

有什么想法可以让它发挥作用吗?


以下是我的 pom 的相关部分:

<properties>
    <maven.compiler.release>15</maven.compiler.release> <!-- Java 15 -->
</properties>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
        </plugin>
    </plugins>
</build>
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId> <!-- for testing -->
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.openjdk.nashorn/nashorn-core -->
    <dependency>
        <groupId>org.openjdk.nashorn</groupId>
        <artifactId>nashorn-core</artifactId> <!-- for javascript-->
        <version>15.3</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.python/jython -->
    <dependency>
        <groupId>org.python</groupId>
        <artifactId>jython</artifactId> <!-- for python -->
        <version>2.7.2</version>
    </dependency>
</dependencies>

我使用https://stackoverflow.com/a/38039047/5333340中的方法来打印可用的引擎,我得到的输出是:

ScriptEngineFactory Info
    Script Engine: OpenJDK Nashorn (15.3)
    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.2)
    Engine Alias: python
    Engine Alias: jython
    Language: python (2.7)

所以找到了引擎。但为什么我不能得到它?我仔细检查了里面的参数getEngineByName没有错别字。

我什至在我的计算机上安装了 python 2.7(虽然我认为这实际上没有必要;实现应该在 jython 包中),但它并没有改变任何东西。

标签: javapythonjavax.script

解决方案


似乎我没有使用正确的依赖...

我换了

<!-- https://mvnrepository.com/artifact/org.python/jython -->
<dependency>
    <groupId>org.python</groupId>
    <artifactId>jython</artifactId>
    <version>2.7.2</version>
</dependency>

经过

<!-- https://mvnrepository.com/artifact/org.python/jython-standalone -->
<dependency>
    <groupId>org.python</groupId>
    <artifactId>jython-standalone</artifactId>
    <version>2.7.2</version>
</dependency>

就是这样。


推荐阅读