java - 已弃用 Nashorn 的建议
问题描述
我正在使用一个库将布尔表达式评估为字符串。使用该库,我收到以下 Java 11 警告:
jdk.nashorn.api.scripting 中的 NashornScriptEngineFactory 已被弃用并标记为删除
但是,我对此有点不清楚。我正在使用以下代码,但我没有看到此代码中引用了 Nashorn,但警告仍然存在。
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");
Boolean val = (Boolean) engine.eval(ruleString);
我的问题是这个警告是否仍然适用于这段代码?另外,如果是这样,我可以使用另一种选择吗?
在此先感谢您的帮助。
解决方案
Nashorn 是 Java 8+ 的默认 Javascript 引擎。所以这样做:
ScriptEngine engine = factory.getEngineByName("JavaScript")
启动 nashorn javascript 引擎。
所以是的,nashorn 已被弃用的事实(被这个 JEP弃用)确实会影响这段代码,但是 oracle 将在 2026 年 9 月之前支持 java 11(在此处描述),所以至少在那时你对 java 11 的补丁等都很满意。
此外,弃用意味着“标记为在将来某个时间点删除”,实际上并未从 JDK 中删除,因此它也可能潜入下一个 LTS JDK。
要在 JVM 上继续使用 javascript,可以选择:
- 回到 Rhino(不是很诱人,因为它很慢 - 它不使用更新的字节码指令,例如
invokedynamic
) - 迁移到 GraalVM graaljs。这可能是您获得现代 ECMAscript (2019) 时的最佳选择,它旨在为生产做好准备并为许多目标平台构建本机二进制文件。
推荐阅读
- c# - XAML + Awesome:更改触发器样式
- python - Python3 simplejson异常
- python - 错误:不再支持将列表喜欢传递给带有任何缺失标签的 .loc 或 []
- laravel - 无法使用 scout elasticsearch laravel 从 laravel 应用程序创建索引 aws elasticsearch
- laravel - Laravel Socialite Google Signin 不适用于个人资料范围
- django - Django 消息变量在 If.. 语句中不可用
- reactjs - Typescript - 如何使用现有属性扩展接口?
- c - 分析 C 中的变量,然后决定要做什么
- mysql - docker-compose mysql 持久数据
- c - strcmp 问题分段错误插入方法不起作用