JAVA的动态执行1 - javax.script.ScriptEngineManager

JDK1.6中使用JS脚本
本文介绍如何在JDK1.6中利用javax.script包动态执行JavaScript代码。通过两个示例展示了如何创建并使用ScriptEngine来评估简单的JS逻辑及调用自定义JS函数。
JDK1.6提供了很多新功能,其中有一个叫javax.script的软件包,用于解析Javascript代码。通过这个功能我们可以在程序运行时动态执行一些JS代码。

[b]范例1:[/b]

// 创建引擎管理器
ScriptEngineManager sem = new ScriptEngineManager();
// 创建一个处理JS的引擎
ScriptEngine engine = sem.getEngineByExtension("js");
try{
// EVAL
engine.eval("if(1 > 2){re = true;}else{re = false;}");
}catch(ScriptException ex){
ex.printStackTrace();
}
//获取JS变量re
System.out.println((engine.get("re")));


[b]范例2:[/b]

ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine engine = sem.getEngineByName("JavaScript");
//写一个函数
String script = "function max(a, b) "
+ "{ return (a > b) ? true : false;}";
//执行
engine.eval(script);
Invocable inv = (Invocable) engine;
//执行函数
System.out.println(inv.invokeFunction("max", "1", "2"));
### 检查 JDK 版本与 `ScriptEngineManager` 的可用性 `ScriptEngineManager` 类属于 `javax.script` 包,是 Java 标准库的一部分,但在不同 JDK 版本中的可用性有所不同。在 Java 8 中,该类默认可用,但在 Java 15 及更高版本中,Nashorn 脚本引擎已被移除[^1]。如果项目使用的是 Java 15 或更高版本,并且未手动引入兼容的脚本引擎依赖,则会导致 `ScriptEngineManager` 类无法解析。 可以通过以下方式检查当前 JDK 是否支持 `ScriptEngineManager`: ```java import javax.script.ScriptEngineManager; public class CheckScriptEngine { public static void main(String[] args) { try { ScriptEngineManager manager = new ScriptEngineManager(); System.out.println("ScriptEngineManager is available."); } catch (NoClassDefFoundError | Exception e) { System.out.println("ScriptEngineManager is not available."); } } } ``` ### 添加 Nashorn 或 GraalVM 脚本引擎依赖 如果确认 `ScriptEngineManager` 无法解析,需根据项目使用的 JDK 版本添加对应的脚本引擎依赖。对于 Java 11 及以上版本,推荐使用 OpenJDK Nashorn 或 GraalVM 提供的脚本引擎。 #### 使用 OpenJDK Nashorn(适用于 Java 11 - Java 14) ```xml <dependency> <groupId>org.openjdk.nashorn</groupId> <artifactId>nashorn-core</artifactId> <version>15.4</version> </dependency> ``` #### 使用 GraalVM JavaScript 引擎(适用于 Java 15 及以上) ```xml <dependency> <groupId>org.graalvm.js</groupId> <artifactId>js</artifactId> <version>22.3.0</version> </dependency> <dependency> <groupId>org.graalvm.js</groupId> <artifactId>js-scriptengine</artifactId> <version>22.3.0</version> </dependency> ``` ### 验证脚本引擎是否正确加载 引入依赖后,可通过以下代码验证脚本引擎是否正确加载: ```java import javax.script.ScriptEngineManager; import javax.script.ScriptEngine; public class TestScriptEngine { public static void main(String[] args) { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript"); if (engine != null) { System.out.println("JavaScript engine is available."); try { Object result = engine.eval("1 + 2"); System.out.println("Result: " + result); } catch (Exception e) { e.printStackTrace(); } } else { System.out.println("JavaScript engine is NOT available."); } } } ``` ### 使用 Maven 检查依赖树以确认冲突或缺失 如果 `ScriptEngineManager` 仍然无法解析,可能是由于 Maven 依赖冲突或未正确加载。执行以下命令检查依赖树: ```bash mvn dependency:tree ``` 如果发现 `nashorn-core` 或 `js-scriptengine` 被其他版本覆盖,可使用 `<exclusion>` 排除冲突版本: ```xml <dependency> <groupId>org.openjdk.nashorn</groupId> <artifactId>nashorn-core</artifactId> <version>15.4</version> <exclusions> <exclusion> <groupId>some.conflicting.group</groupId> <artifactId>conflicting-artifact</artifactId> </exclusion> </exclusions> </dependency> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值