【问题标题】:Recommendation with Nashorn depracated [duplicate]Nashorn 的建议已弃用 [重复]
【发布时间】:2021-01-02 16:44:45
【问题描述】:

我正在使用库将布尔表达式作为字符串进行计算。使用该库时,我会收到以下 Java 11 警告:

jdk.nashorn.api.scripting 中的 NashornScriptEngineFactory 已被弃用并标记为删除

但是,我对此有点不清楚。我正在使用以下代码,但我没有看到此代码中引用了 Nashorn,但警告仍然存在。

ScriptEngineManager factory = new ScriptEngineManager(); ScriptEngine engine = factory.getEngineByName("JavaScript"); Boolean val = (Boolean) engine.eval(ruleString);

我的问题是这个警告是否仍然适用于这段代码?另外,如果是这样,我可以使用其他替代方法吗?

提前感谢您的帮助。

【问题讨论】:

  • 离题请求异地资源;但您寻求的答案是Rhino(也许有一天,Graal)。
  • 或者继续使用未捆绑的 Nashorn。或者使用不同的技术来评估表达式。

标签: java


【解决方案1】:

Nashorn 是 Java 8+ 的默认 Javascript 引擎。这样做:

ScriptEngine engine = factory.getEngineByName("JavaScript")

启动 nashorn javascript 引擎。

所以是的,nashorn 已被弃用 (by this JEP) 的事实确实会影响此代码,但是 oracle 将在 2026 年 9 月之前支持 java 11 (described here),因此至少在那时您可以使用带有补丁等的 java 11 .

此外,弃用意味着“标记为在将来某个时间点删除”,实际上并未从 JDK 中删除,因此它也可能潜入下一个 LTS JDK。

要在 JVM 上继续使用 javascript,选项如下:

  • 回到 Rhino(不是很诱人,因为它很慢 - 它不使用更新的字节码指令,如 invokedynamic
  • 迁移到 GraalVM graaljs。这可能是您获得现代 ECMAscript (2019) 时的最佳选择,它旨在为生产做好准备并为许多目标平台构建原生二进制文件。

【讨论】:

    【解决方案2】:

    对于简单的表达式,您可以使用 Spring 表达式语言 (SpEL):

    https://www.baeldung.com/spring-expression-language

            val car = Car("Honda", "Jazz", year = 2020)
            val context: EvaluationContext = StandardEvaluationContext(car)
            val expression = expressionParser.parseExpression("year - 2000")
            val result = expression.getValue(context) // = 20
    

    【讨论】:

      猜你喜欢
      • 2013-05-21
      • 2014-05-02
      • 2020-04-20
      • 2018-01-03
      • 2014-10-27
      • 2020-09-23
      • 2014-03-14
      • 2013-02-23
      • 2014-09-18
      相关资源
      最近更新 更多