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

GraalVM原生映像

宰父夕
2023-03-14

我正在尝试用GraalVM创建一个本地映像,我的代码是:

import org.graalvm.polyglot.HostAccess;

public class Console {

    @HostAccess.Export
    public void print(String msg){
        System.out.println(msg);
    }
}

然后我把代码本身称为:

public void callMethod(CommonRequest request) throws ScriptException, IOException, NoSuchMethodException {
        StringBuilder s = new StringBuilder();

        s.append(new PluginJS().load(request.getMethodPath(), true));

        Context context = null;
        try {
            context = Context.newBuilder()
                    .allowHostAccess(HostAccess.ALL)
                    .allowAllAccess(true)
                    .allowCreateThread(true)
                    .allowHostClassLoading(true)
                    .allowIO(true)
                    .allowNativeAccess(true)
                    .allowCreateProcess(true).build();

            putMembers(context.getBindings("js"));

            context.eval("js", s.toString());

        } catch (Exception e) {
            e.printStackTrace();

        } finally {
            context.close();

        }

    }

    private void putMembers(Value value) { 
        value.putMember("Console", new Console());


    }

当我运行IDE或java-jar时,它可以正常工作,但当我尝试编译为本机映像时,会抛出一个错误。下面是用于编译本机映像的命令行。

错误:

TypeError:invokeMember(打印)在JavaObject[com.compiler.commons.log]上。Console@113a2d320(com.compiler.commons.log.Console)]失败,原因是:未知标识符:打印

命令行

graalvm-ce-java8-20.0.0/Contents/Home/bin/java -jar -agentlib:native-image-agent=config-merge-dir=/Users/ze/Documents/java/tool/config compiler-1.0-SNAPSHOT-jar-with-dependencies.jar

graalvm-ce-java8-20.0.0/Contents/Home/bin/native-image --language:js --initialize-at-build-time nomeApp -jar compiler-1.0-SNAPSHOT-jar-with-dependencies.jar

谁能帮帮我吗?谢谢

共有1个答案

狄玉书
2023-03-14

我已经解决了,我需要清理“/config”文件,沿着代理执行应用程序,然后添加一些不同的参数进行编译。见下表:

代理人

/Users/ze/Documents/programs/graalvm-ce-java8-20.0.0/Contents/Home/bin/java -jar -agentlib:native-image-agent=config-merge-dir=/Users/ze/Documents/gitprojects/java/tool/config ./target/compiler-1.0-SNAPSHOT-jar-with-dependencies.jar 

编写

sudo /Users/ze/Documents/programs/graalvm-ce-java8-20.0.0/Contents/Home/bin/native-image --language:js --initialize-at-build-time -H:+AllowIncompleteClasspath -H:+ReportExceptionStackTraces --report-unsupported-elements-at-runtime -H:ConfigurationFileDirectories=/Users/ze/Documents/gitprojects/java/tool/config nameOfApp -jar ./target/compiler-1.0-SNAPSHOT-jar-with-dependencies.jar
 类似资料:
  • 所有使用指南都显示了如何在单个 JAR 文件上运行。但我相信大多数项目通常在类路径上使用多个JAR(例如Gradle默认方式)。如何告诉本机映像将它们全部捆绑到一个可执行文件中?

  • 运行Micronaut应用程序的本机映像时,检索Prometheus指标失败,因为它无法获取jvm指标。 当然,预编译应用程序并仅包括实际使用的内容,但运行本机映像时使用的是哪种JVM?我认为它也是标准热点虚拟机的一个大大简化的版本。 那么,在运行本机映像时,是否有可能获取jvm指标,或者是否应该使用其他方法来检索正在运行的应用程序的cpu和内存统计信息? 在这种情况下,我使用了Micronaut

  • 失败:生成失败,出现异常。 错误:执行任务“:QuarkusBuild”失败。Io.Quarkus.Builder.BuildException:生成失败:由于错误导致生成失败[error]:生成步骤Io.Quarkus.Deployment.Pkg.Steps.NativeImageBuildStep#Build引发异常:java.lang.RuntimeException:未能在io.Quar

  • Spring Boot通过引入Spring Graal Native 0.6.0特性引入了GraalVM本机映像支持。现在,如果我们有一个成功编译的本机Spring启动应用程序,我们如何在命令行上动态更改应用程序的端口(就像我们在JVM模式中习惯的那样)? 这对于使用Docker或云提供商的部署场景至关重要……

  • 我正在尝试将我的. jar项目转换为本地映像,因为我需要在不支持Java的设备中运行它。为此,我安装了GraalVM和所有必需的依赖项,本地映像构建工作完美(或者至少看起来是这样,因为它在过程中不会产生任何错误)。 我用于构建的命令是: /usr/lib/jvm/graalvm/bin/native image-jar-MyApp。jar MyApp——启用http——启用https——无回退——

  • 我正在遵循本机Quarkus的官方教程,但无法运行以下步骤: GRAALVM发行版中不存在目录。 我从https://github.com/oracle/graal/releases下载了最新的GraalVM,版本19.3.1在这个日期。 我应该如何运行命令?