在 Java 17 中使用 Javascript 脚本引擎

问题描述 投票:0回答:2

我必须将项目从 Java 8 迁移到 Java 17。

我可以解决大多数问题,但它包含一个方法,其中我使用 ScriptEngineManager 来评估数学术语。

 ScriptEngineManager mgr = new ScriptEngineManager();
 ScriptEngine e = mgr.getEngineByName("JavaScript");
 
 String t = "5*7";
 if (isMathTerm(t)) {
    System.out.println(e.eval(t).toString());
 }

在 Java 8 中它按要求工作,但在 Java 17 中

e
始终为 null。

根据 google 的说法,Java 17 中不再支持 JavaScript 引擎。

由于项目限制,我不允许使用第三方库。

Java 17 中有处理这个问题的正确方法吗?

java eval scriptengine java-17
2个回答
20
投票

Nashorn JavaScript 引擎 已从 Java 中删除。 在 Java 11 中已弃用在 Java 15 中已删除

所以你需要使用不同的脚本引擎,如GraalVM

切换到 GraalVM JavaScript 引擎。首先,将所需的依赖项添加到您的项目中。

<dependency>
  <groupId>org.graalvm.js</groupId>
  <artifactId>js</artifactId>
  <version>22.0.0</version>
</dependency>  
<dependency>
  <groupId>org.graalvm.js</groupId>
  <artifactId>js-scriptengine</artifactId>
  <version>22.0.0</version>
</dependency>

然后将引擎名称更改为graal.js。

// Graal
ScriptEngine graalEngine = new ScriptEngineManager().getEngineByName("graal.js");
graalEngine.eval("print('Hello World!');");

您可以使用以下方式检查哪些引擎可用

new ScriptEngineManager().getEngineFactories();

或者向您的项目添加不同的脚本引擎,如velocity、jexl、groovy...


0
投票

Nashorn 脚本引擎现在作为单独的独立项目进行维护

https://github.com/openjdk/nashorn

该项目的 Maven 工件也可用:

https://mvnrepository.com/artifact/org.openjdk.nashorn

© www.soinside.com 2019 - 2024. All rights reserved.