标签: graalvm

GraalVM - 在没有上下文的情况下使用多语言值

我正在 Graal 上编写一个应用程序,它将能够以不同的语言执行小脚本。

我正在尝试为我用来将 Context.eval() 调用(类型:值)的结果转换/处理为 Java 对象的类编写一些单元测试。我从文档中知道一个 Value 实例总是绑定到一个上下文,所以当我尝试写这样的东西时:

@Test
public void NumericFloatTest() throws ScriptExecutionException {

    GuestLanguageResultProcessor LangProcessor = new GuestLanguageResultProcessor();
    Float javaValue = (float) 43.25;
    Value numValue = Value.asValue(javaValue);
    LangProcessor.processResult(numValue);

    Object result = LangProcessor.processResult(numValue);

    assertThat(result.getClass()).isEqualTo(Float.class);
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

java.lang.IllegalStateException: No current context is available. Make sure the Java method is invoked by a Graal guest language or a context is entered using Context.enter().
Run Code Online (Sandbox Code Playgroud)

我想从概念上讲,拥有一个没有相关客户代码位的“值”实例是没有意义的,所以我的问题是:

我该如何测试我的 GuestLanguageResultProcessor 类?我是否必须通过创建上下文来“膨胀”我的单元测试?

专家的附带问题:我还使用此类 (GuestLanguageResultProcessor) 从多语言 Value 实例中提取 Java 值,以便我可以关闭上下文。换句话说,在我看来,在能够执行 Context.close() 之前,我需要调用 [value instance].asString() 或 …

graalvm

3
推荐指数
1
解决办法
673
查看次数

如何使用GraalVM创建Node.js本机映像

我试图从一个简单的node.js example.js应用程序创建本机映像。

使用以下命令运行应用程序时:

 node --native -i --native example.js
Run Code Online (Sandbox Code Playgroud)

然后该应用程序将启动并按预期运行。

现在,我想创建一个本地图像。我尝试了以下命令:

 native-image --language:js example.js
Run Code Online (Sandbox Code Playgroud)

但是由于错误,它不起作用:

Build on Server(pid: 77626, port: 64052)
[example.js:77626]    classlist:   3,964.04 ms
error: Main entry point class 'example.js' not found.
Error: Processing image build request failed
Run Code Online (Sandbox Code Playgroud)

作为解决方案,我在以下位置创建了一个主入口点example.js

function main(args) {
  console.log("Main app started")
}
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用。

通常有没有办法为js / node.js应用程序创建本机映像?

javascript node.js graalvm

3
推荐指数
1
解决办法
497
查看次数

GraalVM作为ARM JRE的JIT编译器

有人知道GraalVM是否可以在ARM体系结构的OpenJDK发行版中用作JIT编译器吗?

graalVM github精确AMD架构和github ARM相关问题上可用的发行版与本机映像创建有关(因此适用于ARM的AOT编译器)。也许还有一个问题:如果他们成功地为arm创建了本地映像,这是否意味着GraalVM也可以作为arm的JIT编译器使用?还是这两个东西是独立的?我从编译器生态系统开始:)

非常感谢您的回答。

java graalvm

3
推荐指数
2
解决办法
1449
查看次数

使用 GraalVM JDK 构建/运行您的应用程序

我正在尝试使用 GraalVM JDK 来构建我的应用程序。我在“平台设置> SDK”中添加了 GraalVM JDK 并选择了它,然后单击“确定”。

在此处输入图片说明

当我构建我的项目时,我可以看到它仍在使用不同的“java”可执行文件。

/../_sandbox/lib/jdk8.0.222/bin/java -Dmaven.multiModuleProjectDirectory=/../Desktop/_sandbox/someproject "-Dmaven.home=/../Library/Application Support/JetBrains/Toolbox/apps/IDEA-U/ch-0/192.7142.36/IntelliJ IDEA.app/Contents/plugins/maven/lib/maven3" -Didea.modules.paths.file=/../Library/Caches/IntelliJIdea2019.2/Maven/idea-projects-state-3333fba9.properties -Dclassworlds.conf=/private/var/folders/2g/9fxnhqts6qsf_h81cnbts8tc0000gn/T/idea-7-mvn.conf "-Dmaven.ext.class.path=/../Library/Application Support/JetBrains/Toolbox/apps/IDEA-U/ch-0/192.7142.36/IntelliJ IDEA.app/Contents/plugins/maven/lib/maven-event-listener.jar" "-javaagent:/../Library/Application Support/JetBrains/Toolbox/apps/IDEA-U/ch-0/192.7142.36/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=49971:/../Library/Application Support/JetBrains/Toolbox/apps/IDEA-U/ch-0/192.7142.36/IntelliJ IDEA.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath "/../Library/Application Support/JetBrains/Toolbox/apps/IDEA-U/ch-0/192.7142.36/IntelliJ IDEA.app/Contents/plugins/maven/lib/maven3/boot/plexus-classworlds-2.6.0.jar" org.codehaus.classworlds.Launcher -Didea.version2019.2.4 clean install
Picked up JAVA_TOOL_OPTIONS: -Duser.timezone=Etc/UTC -XX:+UseJVMCICompiler
Unrecognized VM option 'UseJVMCICompiler'
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
Run Code Online (Sandbox Code Playgroud)

我在 GraalVM 上使用“-XX:+UseJVMCICompiler”标志,因为普通的 JDK1.8 不支持该标志,所以我收到错误消息。

我希望java路径是/../_sandbox/lib/graalvm-ce-java8-19.3.0/Contents/Home/bin/java如果

java intellij-idea graalvm

3
推荐指数
1
解决办法
2616
查看次数

从宿主语言注入成员以作为访客语言类型到达访客语言

这个问题与以下内容有些相关: GraalVM - Using Polyglot Value without a context

在我的应用程序中,以客户语言运行的代码片段不需要知道注入的参数(通过绑定成员)是 Java 参数。相反,对于用客语开发的人来说,论点应该看起来只是客语本身的另一个论点。

例如,我想要一个从我的 Java 主机语言注入到 JS 来宾脚本的数组,以这种方式:

Value guestLanguageBindings = context.getBindings(scriptData.getLanguage().toString());

guestLanguageBindings.putMember(argumentName, argumentValue);
Run Code Online (Sandbox Code Playgroud)

作为 JS 数组“到达”来宾语言,而不是像现在正在发生的 java.util.ArrayList。

目前,我通过将每个非原始类型(我注意到 String、int 等作为 JS“类型”到达 JS)转换为 JSON 并转换回来宾语言来解决这个问题。

这有效,但我想知道是否有更合适的方法来做到这一点,或者确实使用绑定是正确的方法?

谢谢!

graalvm

2
推荐指数
1
解决办法
1074
查看次数

为什么在 GraalVM 社区版上使用 org.graalvm.polyglot 而不是 javax.script 包?

我有一个在java-8-openjdk-amd64上工作的 java 应用程序,它评估 java 脚本。现在我安装了 GraalVM 社区版graalvm-ce-19.2.0 (ubuntu 18.04) 并尝试评估一些 javascript 示例org.graalvm.polyglot.Context 并且它们是有效的,但是当我发现旧的 java 脚本代码崩溃并且堆栈跟踪显示它是用org. graalvm包而不是javax.script

import javax.script.ScriptEngine;
            ...
            ScriptEngine engine = 
            scriptFactory.getEngineByName("JavaScript");
            engine.put("form", postedAnswer);
            engine.put("question", jsQuestion);
            engine.put("answer", jsAnswer);
            engine.eval(validationJS); //here Exception thrown
Run Code Online (Sandbox Code Playgroud)

这里堆栈跟踪:

javax.script.ScriptException: org.graalvm.polyglot.PolyglotException: TypeError: invokeMember (getData) on JavaObject[com.researchforgood.survey.surveyengine.JSQuestion@504641f2 (com.researchforgood.survey.surveyengine.JSQuestion)] failed due to: Unknown identifier: getData
    at com.oracle.truffle.js.scriptengine.GraalJSScriptEngine.eval(GraalJSScriptEngine.java:348)
    at com.oracle.truffle.js.scriptengine.GraalJSScriptEngine.eval(GraalJSScriptEngine.java:323)
    at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264)
    at com.researchforgood.survey.surveyengine.service.StepService.validateAnswers(StepService.java:233)
    at com.researchforgood.survey.surveyengine.service.StepService.processAnswers(StepService.java:95)
    at com.researchforgood.survey.surveyengine.HttpSurveyHandler.doPost(HttpSurveyHandler.java:160)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at com.researchforgood.api.apigateway.ServletHandler.handle(ServletHandler.java:62)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1345) …
Run Code Online (Sandbox Code Playgroud)

java graalvm

2
推荐指数
1
解决办法
846
查看次数

如何使用 GluonHQ 客户端、Native Image 和 GraalVM 解决编译的 JavaFX 项目中的 fxml 加载异常?

这是这个问题的后续问题。

我正在尝试将 JavaFX 项目编译为本地映像,以便它可以在本地运行,而无需用户安装 Java。GluonHQ客户端插件解决了JavaFX和反射的问题,现在编译成功。

我设法使用 Gluon 客户端 maven 插件编译了一个简单的 JavaFX 项目(IntelliJ 在创建 JavaFX 项目时生成的示例)。但是,在命令行中运行本机映像时,会出现 JavaFX fxml 加载异常:

Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
        at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
        at java.lang.Thread.run(Thread.java:834)
        at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:518)
        at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:192)
Caused by: javafx.fxml.LoadException: 
sample.fxml:8

        at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2629)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2607)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2470)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3241)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3198)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3167)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3140)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3117)
        at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3110)
        at sample.Main.start(Main.java:13)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
        at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
        at java.security.AccessController.doPrivileged(AccessController.java:101)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
        at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
        at com.oracle.svm.jni.JNIJavaCallWrappers.jniInvoke_VA_LIST:Ljava_lang_Runnable_2_0002erun_00028_00029V(JNIJavaCallWrappers.java:0)
        at com.sun.glass.ui.gtk.GtkApplication._runLoop(GtkApplication.java) …
Run Code Online (Sandbox Code Playgroud)

java linux javafx maven graalvm

2
推荐指数
1
解决办法
316
查看次数

如何从 Spring Native Gradle 项目运行 GraalVM 本机图像跟踪代理?

我找到了有关如何从 Spring Native Maven 项目运行 GraalVM 本机图像跟踪代理的信息,但我找不到有关如何从 Gradle 项目运行该操作的信息。

请参阅https://docs.spring.io/spring-native/docs/current/reference/htmlsingle/#_using_it_with_maven

关于如何从 Gradle 项目中做到这一点有什么想法吗?

gradle graalvm spring-native

2
推荐指数
1
解决办法
1105
查看次数

本机图像大小至少是实际 Jar 大小的两倍

已经构建了一个native-image使用Spring Boot 3.0.1GraalVM 22.3.0. 构建的native-image大小至少是原始应用程序 jar 的两倍。

我理解如果未使用的类作为本机映像构建过程的一部分被删除,它的大小应该更小。

spring-boot graalvm graalvm-native-image

2
推荐指数
1
解决办法
1073
查看次数

如何为 Quarkus App 生成 PGO 优化的本机可执行文件?

我有一个作为 REST API 公开的 Quarkus 应用程序。我需要为该应用程序生成配置文件引导的优化本机映像。

我查看了 Quarkus 文档,但找不到太多内容。有人生成过相同的吗?

我在本地计算机上安装了 GraalVM Enterprise 版本。

要生成正常的本机映像,请使用以下命令:

./mvnw package -Dnative

graalvm quarkus graalvm-native-image quarkus-native

2
推荐指数
1
解决办法
377
查看次数