如何使用GraalVM在现有的Grails或Spring应用程序中运行JavaScript?

4
很不幸,Nashorn已被弃用,因为有很多例子。
我们知道GraalVM可以编译和运行应用程序。但我们不需要这个功能。
我们只想在Java应用程序中运行一些JavaScript。加载JavaScript文件,然后定期调用其中的方法,并要求JavaScript响应Java的调用。该JavaScript引擎是我们需要能够在浏览器客户端或服务器上运行的引擎。
有没有人看到使用GraalVM在spring应用程序或更好的grails中运行js文件的方法?我们使用gradle。
要明确一点,我们不想使用GraalVM编译我们的应用程序。我们只需要一个可以在现有应用程序内部运行js的实用程序。
示例和文档非常缺乏。似乎也没有gradle插件或选项来支持它。
还是应该坚持使用Nashorn吗?
2个回答

1
推荐使用GraalVM来运行JavaScript引擎,这并不意外。你好像对GraalVM和GraalVM本地映像之间存在一些误解。GraalVM是一个功能齐全的JDK8,它支持Java应用程序的预编译,但并不强制要求。您可以像使用任何其他JDK8一样使用GraalVM(例如将JAVA_HOME指向GraalVM目录)。您只需要获得多语言支持和更好的性能。
如果您正在运行JDK11+,请查看示例maven项目https://github.com/graalvm/graal-js-jdk11-maven-demo(如此回答通过标准JDK 11使用graalvm
如果您正在使用JDK8,并坚持不使用GraalVM,则您的选择相当有限。您仍然可以使用GraalVM JavaScript引擎,但只能以解释模式运行,从而导致性能更差。我链接的示例存储库在pom.xml文件中具有“jdk8”配置文件,显示如何在标准jdk8上运行。

非常有趣!我已经阅读了很多关于GraalVM的资料,但是我错过了一个关键信息,那就是它是JDK的替代品。然而,如果它是JDK8的替代品,为什么它不也是JDK11的替代品呢?我们已经在生产环境中运行Oracle Java 8多年了,因此更换新的、未知的虚拟机可能会引起一些担忧。 - John Little
刚才四处看了一下,似乎GraalVM作为JDK替代品还没有被广泛使用。这个网站显示它使用更多的CPU并且响应时间更慢,但现在可能已经不同了。 - John Little
正在开发基于JDK11的GraalVM。 GraalVM可能是新的,但它绝非未知(特别是如果您已经运行Oracle https://www.oracle.com/tools/graalvm-enterprise-edition.html)。我建议您自己尝试并查看它在您特定工作负载下的表现。 - BoriS

1
根据文档,应该按照以下方式进行:
package graaltest;
import org.graalvm.polyglot.*;
public class GraalVMTest {
  public static void main(String[] args) {
    Context context = Context.create();
    context.eval("js", "var test = Java.type('graaltest.GraalVMTest'); test.hello('World');");
  }

  public static void hello(String what) {
    System.out.println("Hello "+what);
  }
}

谢谢,但关键是如何将所需的库文件引入应用程序,并编译它以便我们可以运行它。例如,我们有现有的Grails应用程序,我们想在其中使用js。Grails使用gradle。似乎没有使用gradle(甚至是maven)将所需内容包含到项目中的示例。也许这是不可能的?Nashorn很容易-它内置于Java 8中。 - John Little

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接