在Java 17中使用Javascript脚本引擎

16

我需要将一个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。

根据谷歌的说法,JavaScript引擎在Java 17中不再受支持。

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

在Java 17中有没有适当的方法来处理这个问题?

2个回答

23

Nashorn JavaScript Engine已从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等。


谢谢,但不幸的是由于项目限制,我不被允许使用第三方库。如果它不在标准JDK中,我不能使用它。 - JustMe
1
@JustMe,你能在你的数据库上执行表达式吗?如果不能,请查看 https://dev59.com/7nA75IYBdhLWcg3wMmCo 中的 Boann 的答案。 - user7294900
谢谢,我会尝试一下。 - JustMe
@JustMe 这种情况有点傻,但确实会发生。在这种情况下,可以使用另一种脚本语言(不确定还支持哪些),或者编写自己的脚本语言(不是一件简单的事情,但如果你所处的环境不允许使用他人编写的任何东西,那就只能如此了,这就是生活)。 - jwenting
你能将它分离到一个独立的进程中吗?比如放在一个不同的Docker容器中。我正在考虑自己做类似的事情,以便将主容器与脚本容器隔离开来。 - Archimedes Trajano

1

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