Java 17 版本运行 javascript
<p><strong>使用 Java 运行 JavaScript 脚本</strong></p><p>当前版本:</p>
<p>JDK:17</p>
<p> </p>
<p><strong>测试程序:</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> EngineTest {
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> main(String[] args) <span style="color: rgba(0, 0, 255, 1)">throws</span><span style="color: rgba(0, 0, 0, 1)"> ScriptException, NoSuchMethodException {
var manager </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ScriptEngineManager();
ScriptEngine engine </span>= manager.getEngineByName("javascript"<span style="color: rgba(0, 0, 0, 1)">);
System.out.println(engine);
System.out.println(</span>"test javascript"<span style="color: rgba(0, 0, 0, 1)">);
String scriptString </span>= "var date = new Date();" + "date.getHours();"<span style="color: rgba(0, 0, 0, 1)">;
Double hour </span>=<span style="color: rgba(0, 0, 0, 1)"> (Double)engine.eval(scriptString);
System.out.println(hour);
engine.eval(</span>"n = 1728"<span style="color: rgba(0, 0, 0, 1)">);
Object result </span>= engine.eval("n + 1"<span style="color: rgba(0, 0, 0, 1)">);
System.out.println(result);
engine.eval(</span>"function Greeter(how) { this.how = how}"<span style="color: rgba(0, 0, 0, 1)">);
engine.eval(</span>"Greeter.prototype.welcome = function(whom) {return this.how + ',' + whom +'!'}"<span style="color: rgba(0, 0, 0, 1)">);
Object obj </span>= engine.eval("new Greeter('Yo')"<span style="color: rgba(0, 0, 0, 1)">);
result </span>= ((Invocable) engine).invokeMethod(obj, "welcome", "World"<span style="color: rgba(0, 0, 0, 1)">);
System.out.println(result.toString());
}
}</span></pre>
</div>
<p> </p>
<p><strong>1. 调试:</strong></p>
<p> IdeaJ 直接运行,报错</p>
<div class="cnblogs_code">
<pre>Exception in thread "main" java.lang.NullPointerException: Cannot invoke "javax.script.ScriptEngine.eval(String)" because "engine" is <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">
at scriptEngine.EngineTest.main(EngineTest.java:</span>18)</pre>
</div>
<p><strong>分析原因:</strong></p>
<p> Java 15 及以后版本,移除了 nashorn,导致没有 engine</p>
<p><strong>解决办法:</strong></p>
<p><strong> </strong>手动向 Module 中加载 nashorn</p>
<p> 下载 nashorn,链接:https://mvnrepository.com/artifact/org.openjdk.nashorn/nashorn-core/15.4</p>
<p> 向 Module 中加载,如下图所示 </p>
<p> <img src="https://img2023.cnblogs.com/blog/1251574/202305/1251574-20230523095853769-1753995438.png" alt="" loading="lazy"></p>
<p> </p>
<p><strong>2. 继续调试 </strong></p>
<p> IdeaJ报错信息如下:</p>
<div class="cnblogs_code">
<pre>Exception in thread "main" java.lang.NoClassDefFoundError: org/objectweb/asm/<span style="color: rgba(0, 0, 0, 1)">Type
at org.openjdk.nashorn.internal.codegen.types.Type.getInternalName(Type.java:</span>405<span style="color: rgba(0, 0, 0, 1)">)
at org.openjdk.nashorn.internal.codegen.CompilerConstants.className(CompilerConstants.java:</span>286<span style="color: rgba(0, 0, 0, 1)">)
at org.openjdk.nashorn.internal.codegen.CompilerConstants.staticCallNoLookup(CompilerConstants.java:</span>425<span style="color: rgba(0, 0, 0, 1)">)
at org.openjdk.nashorn.internal.codegen.types.BooleanType.</span><clinit>(BooleanType.java:47)</pre>
</div>
<p><strong>分析原因:</strong></p>
<p> 缺少相关类 asm 类,同第一步,下载 asm(注意版本,不要下载 3.x 版本,将与 JDK无法兼容),链接 https://mvnrepository.com/artifact/org.ow2.asm/asm/9.5</p>
<p> </p>
<p>同样的调试,根据错误,分析原因,得出,还需要加载:</p>
<p>asm-util,下载链接:https://mvnrepository.com/artifact/org.ow2.asm/asm-util/9.5</p>
<p> </p>
<p>至此,脚本正常运行,并生成结果</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">org.openjdk.nashorn.api.scripting.NashornScriptEngine@78186a70
test javascript
</span>10.0
1729.0<span style="color: rgba(0, 0, 0, 1)">
Yo,World</span>!</pre>
</div>
<p> </p>
<p><strong>总结:</strong></p>
<p>因为 JDK 15 以后移除了 nashorn,所以在 JDK 17 中要运行 javascript,需要加载下面三个 jar 包。</p>
<p><img src="https://img2023.cnblogs.com/blog/1251574/202305/1251574-20230523101005227-1308815635.png" alt="" loading="lazy"></p>
<p> </p><br><br>
来源:https://www.cnblogs.com/bruce-he/p/17422524.html
頁:
[1]