当前位置: 首页 > 知识库问答 >
问题:

在GraalVM本机映像中从Java代码运行JS脚本

夹谷志
2023-03-14

我正在试验在GraalVM本机映像中从Java代码运行JS脚本。

Java代码如下所示:

try (Context context = Context.create("js")) {
    Value bindings = context.getBindings("js");
    bindings.putMember("response", response);
    bindings.putMember("UTF8", StandardCharsets.UTF_8);
    context.eval("js", script);
} catch (PolyglotException e) {
    error("Error: " + e, 10);
}

JS代码只是通过调用响应对象上的一个方法来尝试使用它,例如:

 print("Status code: " + response.getStatusCode());

当在GraalVM中运行时,这项功能有效,但当创建本机映像时,它会失败,并出现以下错误:

INVOKE on JavaObject[...] failed due to: Message not supported: INVOKE

如果我只是像在print(“Response:”Response)中那样打印对象 ,它不会失败。但是如果我试图调用response上的任何方法,就会出现这个错误(甚至toString()hashCode())。

目前,我还需要做些什么,或者这只是SubstractVM本机映像中的一个bug?

我的GraalVM版本:

java version "1.8.0_172"
Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
GraalVM 1.0.0-rc4 (build 25.71-b01-internal-jvmci-0.45, mixed mode)

我正在使用的原生图像命令:

native-image --language:js --report-unsupported-elements-at-runtime -jar my.jar

共有1个答案

欧阳博文
2023-03-14

更新:从RC 13开始,现在支持使用本机映像进行反射访问。您需要为本机映像提供反射配置。

不幸的是,从RC5开始,GraalVM在使用本机映像编译时还不支持Java对象的反射访问。我们计划在下一个候选版本中支持这一点。

作为临时解决方案,您可以使用代理API,如下所示:

try (Context context = Context.create("js")) {
    Map<String, Object> myObject = new HashMap<>();
    myObject.put("foo", "bar");
    context.getBindings("js").putMember("hostObject", ProxyObject.fromMap(myObject));
    assert "bar".equals(context.eval("js", "hostObject.foo").asString());
    myObject.put("foo", "baz");
    assert "baz".equals(context.eval("js", "hostObject.foo").asString());
}

代理API允许模拟来宾语言值。

下面是另一个代理示例:http://www.graalvm.org/docs/graalvm-as-a-platform/embed/#computed-使用polyglot代理的数组

代理Javadoc:http://www.graalvm.org/sdk/javadoc/org/graalvm/polyglot/proxy/package-summary.html

 类似资料:
  • 问题内容: 我快要解决这个问题了。 下面是代码: 问题答案: 您的代码是正确的,我相信您不会收到异常,如果您使用进行阅读,则不会得到任何东西。 已经说过,现在命令是100%以这种方式执行,这是因为您正在回显某些内容,需要使用来将其读回。 检查以下示例,该示例将成功创建一个名目录并打印您正在回显的内容。为了将其放入日志文件,恐怕您可以使用“>”来完成它,您可能必须使用一些编辑器命令或使用Java创建

  • 这是我第一次在java中尝试python。我试图从我的代码中执行python脚本,如下所示。 但我有以下例外 无法运行程序“python”:CreateProcess error=2,系统找不到指定的文件 我已经安装了python。我不确定为什么找不到该文件。我试着跟随这个链接,但它并没有解决我的问题。 提前谢谢。 编辑1 我尝试了“Viacheslav Vedenin”给出的示例代码,当我执行我

  • 我正在尝试使用GraalVM为spring cloud gateway构建本机映像。我已经成功构建了一个可以启动的本机映像,但在第一个http请求时,我出现了以下错误: 添加此标志没有帮助 并在反射配置中添加一个条目,不是吗 该项目可以在这里找到:https://github.com/hanouard/demo-native-gateway 你知道是什么导致了这个错误吗?

  • 我正在试图弄清楚如何通过将GraalVM本机映像代理与Quarkus应用程序一起使用。 我试着跑步: 但是我得到了一个错误: 有什么提示吗? 我的Java版本:

  • 我设法为springboot fat jar构建了本机映像,但当我运行它时,它抛出了异常:“”。我尝试添加一个默认构造和一个空的init()方法,但都失败了。如何克服此异常并使本机映像运行? 以下是完整日志:

  • 问题内容: 从Java运行Unix命令非常简单。 但是可以从Java代码运行Unix Shell脚本吗?如果是,从Java代码中运行Shell脚本是一个好习惯吗? 问题答案: 你应该真正看一下Process Builder。它确实是为这种事情而构建的。