从JDK8开始,Nashorn脚本引擎正式被采用,相较于老引擎性能上有不少提升。但是到如今的JDK13,Nashorn即将被放弃,意味着在未来的某个发行版JDK中将无法再使用Nashorn引擎。当在JDK11以后的版本(包括JDK11)使用Nashorn时,控制台会输出这么一行信息:
当然,这不会影响你的使用,只是每调用一次Nashorn,就会刷出一条信息。这个警告信息自然也可以关闭,但是在这里我们就不讲了,接下来我们讲一下今天的主角:GraalVM.
GraalVM官方网站:https://www.graalvm.org/
GraalVM是一套通用型虚拟机,能执行各类高性能与互操作性任务,并在无需额外成本的前提下允许用户构建多语言应用程序。这是它的优点: 高性能 Java;占用内存小;启动速度快的Java;组合JavaScript、Java、Ruby和R语言;在 JVM 上运行本地语言;适用于所有编程语言的工具;扩展基于 JVM 的应用程序;扩展本地应用程序;将 Java 代码作为本地库;数据库中的 polyglot;创建自己的语言;
说白了它就是个VM,那么问题来了: 如何使用Graal的脚本引擎而不该用graalVM作为运行时呢?
先将以下jar文件放到类路径中:
graaljs.jar (Contents/Home/jre/languages/js/graaljs.jar)
graaljs-scriptengine.jar (Contents/Home/jre/lib/boot/graaljs-scriptengine.jar)
graal-sdk.jar (Contents/Home/jre/lib/boot/graal-sdk.jar)
truffle-api.jar (Contents/Home/jre/lib/truffle/truffle-api.jar)
icu4j.jar (Contents/Home/jre/languages/js/icu4j.jar)
注意:在官方的说明中原文如下:
$GRAALVM/jre/languages/js/graaljs.jar - core component of GraalVM JavaScript (always required)
$GRAALVM/jre/languages/js/icu4j.jar - ICU4J component for internationalization (always required)
$GRAALVM/jre/languages/regex/tregex.jar - GraalVM's regular expression engine (always required)
$GRAALVM/jre/lib/boot/graal-sdk.jar - GraalVM's SDK to implement languages (always required)
$GRAALVM/jre/lib/truffle/truffle-api.jar - GraalVM's Language API, to implement language interpreters (always required)
$GRAALVM/jre/lib/graalvm/graaljs-launcher.jar - GraalVM JavaScript's command line interpreter (optional)
$GRAALVM/jre/lib/graalvm/launcher-common.jar - common launcher code shared by all languages (required by graaljs-launcher.jar)
$GRAALVM/jre/lib/boot/graaljs-scriptengine.jar - GraalVM JavaScript's ScriptEngine/JSR 223 support (optional)
接下来按照正常的获取ScriptEngine的操作:ScriptEngine engine = new ScriptEngineManager().getEngineByName("Graal.js");
最后一点要说明的是:官方有一句话解释是,请注意,此变体不包括作为优化编译器的GraalVM编译器,因此 GraalVM JavaScript的性能将不尽如人意。但是我在实际测试中,并没有发现性能问题,反而性能极佳。
好了,大功告成! 为了方便我把需要的jar包上传吧,省的去GraalVM提取。
点我下载(密码:qqmr)
*引用:graaljs/RunOnJDK.md at master · oracle/graaljs · GitHub
2019年11月17日 5:00 Felix |
|