1. 程式人生 > 實用技巧 >java 整合graalvm js 引擎

java 整合graalvm js 引擎

java 內建的js 引擎nashorn已經是被淘汰的,oracle 比較推薦的是使用graalvm js,以下是一個簡單的整合試用

環境準備

  • pom.xml
  <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.dalong.ex</groupId>
  <artifactId>qlex-learnint</artifactId>
  <version>1.0-SNAPSHOT</version>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <encoding>UTF-8</encoding>
    <java.version>1.8</java.version>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
  <dependencies>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>QLExpress</artifactId>
      <version>3.2.0</version>
    </dependency>
<!--    如果使用了js-scriptengine 以下可選-->
<!--    <dependency>-->
<!--      <groupId>org.graalvm.truffle</groupId>-->
<!--      <artifactId>truffle-api</artifactId>-->
<!--      <version>20.2.0</version>-->
<!--    </dependency>-->
<!--    <dependency>-->
<!--      <groupId>org.graalvm.sdk</groupId>-->
<!--      <artifactId>graal-sdk</artifactId>-->
<!--      <version>20.2.0</version>-->
<!--    </dependency>-->
    <dependency>
      <groupId>org.graalvm.js</groupId>
      <artifactId>js-scriptengine</artifactId>
      <version>20.2.0</version>
    </dependency>
    <dependency>
      <groupId>org.graalvm.js</groupId>
      <artifactId>js</artifactId>
      <version>20.2.0</version>
    </dependency>
  </dependencies>
  <build>
    <!-- Maven Shade Plugin -->
    <finalName>my-expression-app</finalName>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.3</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <mainClass>Application</mainClass>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
  • application.java
    使用兩種方法一種是polyglot 模式,一種是基於ScriptEngineManager模式的
 import org.graalvm.polyglot.Context;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
/**
 @author dalong
*/
public class Application {
  public static void main(String[] args) throws ScriptException, NoSuchMethodException {
    // qlExpression();
    method1();
    method2();
   }
  public static void method1()  {
    System.out.println("Hello Java!");
    try (Context context = Context.newBuilder().allowAllAccess(true).build()) {
      context.eval("js", "print('Hello JavaScript!');");
      context.eval("js", "let user = {name:\"dalong\",age:333}; print(JSON.stringify(user))");
      java.math.BigDecimal v = context.eval("js",
          "var BigDecimal = Java.type('java.math.BigDecimal');" +
              "BigDecimal.valueOf(10).pow(20)")
           .asHostObject();
      System.out.println(v.toString());
     }
   }
  public static void method2() throws ScriptException, NoSuchMethodException {
   //  注意此處可以直接使用js,因為js-scriptengine 的spi 註冊的時候會自動處理了內建的nashorn
    ScriptEngine eng = new ScriptEngineManager().getEngineByName("js");
    eng.eval("let user = {name:\"dalong\",age:333}; print(JSON.stringify(user))");
   }
}

說明

graalvm js 在效能以及js 支援上是很不錯的,是很值的使用,es4x 就是基於graalvm js的,同時新版本的cratedb也是基於此的

參考資料

https://www.graalvm.org/reference-manual/js/JavaInteroperability/
https://github.com/graalvm/graaljs/blob/master/docs/user/JavaScriptCompatibility.md