Apache Ant从Nashorn迁移至GraalVM的配置与代码修改咨询
Apache Ant 从 Nashorn 迁移到 GraalVM JavaScript 操作指南
一、需要引入的Jar包
- 基础运行必选包:
graal-sdk.jar:GraalVM 基础核心SDKjs.jar:GraalVM JavaScript 引擎核心实现包js-scriptengine.jar:JSR-223 脚本引擎规范适配层,是对接Ant script标签的核心依赖truffle-api.jar:GraalVM Truffle 语言框架基础依赖
- 兼容旧Nashorn语法可选包:
nashorn-compat.jar:提供Nashorn语法兼容能力,可大幅减少旧业务代码的改动量
二、Jar包放置路径
- 全局生效方案:将所有Jar包直接放入Apache Ant安装目录下的
lib文件夹中,所有使用该Ant环境的项目都可以直接调用GraalVM JS引擎 - 项目级生效方案:在当前项目中新建独立的依赖存放目录,执行Ant命令时通过
-lib参数指定该目录路径即可,不会影响其他Ant项目的运行环境
三、现有业务代码调整点
- 移除Nashorn专属加载语句:原来的
load("nashorn:mozilla_compat.js")代码可直接删除,引入nashorn-compat.jar后会默认提供Mozilla兼容能力,无需主动加载 - 若未引入兼容包,需要将
importPackage(java.time)这类包引入语法,替换为GraalVM原生的显式引入写法:var LocalDate = Java.type('java.time.LocalDate') - 原有代码中的
self.log、print等Ant绑定的方法不需要修改,可直接正常运行 - Ant script标签的
language="javascript"属性不需要修改,JSR-223适配层会自动识别到GraalVM JS引擎
四、调整后可运行示例代码
<?xml version="1.0" ?> <project name="test" default="test"> <property environment="env"/> <target name="test" > <script language="javascript"> <![CDATA[ importPackage(java.time); var today = new Date(); var date = today.getFullYear()+'-'+(today.getMonth()+1)+'-'+today.getDate(); self.log("This script is for Test Of GraalVM Javascript Engine"); print ("Today is: " + date ); ]]> </script> </target> </project>
运行后不会再输出Nashorn废弃警告,其余执行结果和原Nashorn环境完全一致。
五、迁移实践经验
- 首次迁移优先引入
nashorn-compat.jar做兼容适配,业务代码改动量最小,基本可以实现无缝切换 - 迁移稳定后可逐步将兼容语法替换为GraalVM原生JS语法,运行性能更高,也可以避免后续兼容包迭代带来的适配问题
- 同一运行环境下不要同时保留Nashorn和GraalVM的相关依赖包,避免出现脚本引擎优先级识别冲突的问题
内容的提问来源于stack exchange,提问作者Ostap Bender
相关产品推荐
相关产品推荐

