前提条件
jdk≥1.6
运行方法
准备段JS代码, 另存为test.js文件
function test(str){ return '方法执行成功:入参为' + str; }
java代码:
import javax.script.*; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class JsTest { public static void main(String[] args) { try { //创建一个脚本引擎管理器 ScriptEngineManager manager = new ScriptEngineManager(); //获取一个指定的名称的脚本管理器 System.out.println("当前 JDK 支持的脚本语言引擎:"); for (ScriptEngineFactory available : manager.getEngineFactories()) { System.out.println(available.getEngineName()); System.out.println(available.getNames()); } //输出 [nashorn, Nashorn, js, JS, JavaScript, javascript, ECMAScript, ecmascript] ScriptEngine engine = manager.getEngineByName("ECMAScript"); engine.eval(new FileReader("C:\\Users\\Administrator\\Desktop\\test.js")); //从脚本引擎中返回一个给定接口的实现 Invocable invocable = (Invocable) engine; String aaa = (String)invocable.invokeFunction("test", "测试参数"); System.out.println(aaa ); } catch (ScriptException | NoSuchMethodException | FileNotFoundException e) { e.printStackTrace(); } catch (IOException ioException) { ioException.printStackTrace(); } } }
坑点
- 调试JS文件中的代码:可以在JS文件中需要打印的地方,通过print() 方法 输出内容,这样在java开发工具中就能看到输出的内容
- 使用new Date()方法:js文件中有用到
new Date(xxx)
方法时,改成这样new Date(parseInt(xxx))
,先转成int再使用 - ES6的支持:jdk默认是关闭了对es6的支持的,想要开启对es6的支持,需要设置一下jvm参数
-Dnashorn.args=--language=es6
- 三元表达式:如果运行时提示三元表达那行有报错,可以尝试改成if else
- JDK1.8对toLocaleString方法解析异常:参考https://stackoverflow.com/questions/45373338/tolocalestring-in-nashorn-engine,能升级JDK尽量升级高版本的