苏堤倆柳 發表於 2023-5-23 10:11:00

Java 17 版本运行 javascript

<p><strong>使用 Java 运行 JavaScript 脚本</strong></p>
<p>当前版本:</p>
<p>JDK:17</p>
<p>&nbsp;</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>&nbsp;</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 中加载,如下图所示&nbsp;  </p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<img src="https://img2023.cnblogs.com/blog/1251574/202305/1251574-20230523095853769-1753995438.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p><strong>2. 继续调试&nbsp;</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>&lt;clinit&gt;(BooleanType.java:47)</pre>
</div>
<p><strong>分析原因:</strong></p>
<p>  缺少相关类 asm 类,同第一步,下载 asm(注意版本,不要下载 3.x 版本,将与 JDK无法兼容),链接&nbsp;https://mvnrepository.com/artifact/org.ow2.asm/asm/9.5</p>
<p>&nbsp;</p>
<p>同样的调试,根据错误,分析原因,得出,还需要加载:</p>
<p>asm-util,下载链接:https://mvnrepository.com/artifact/org.ow2.asm/asm-util/9.5</p>
<p>&nbsp;</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>&nbsp;</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>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/bruce-he/p/17422524.html
頁: [1]
查看完整版本: Java 17 版本运行 javascript