ceylon - 如何为 Ceylon 生成 GraalVM 原生镜像?

标签 ceylon graalvm

我尝试将 --static -jar 与 Ceylon 编译的 fat jar 一起使用:

native-image --static -jar default.jar

(default.jar是由ceylon fat-jar生成的fat jar。)

但是我收到一个UnsupportedFeatureException,表示不支持java.lang.Class.getConstantPool()

ceylon程序只是一个简单的hello world(打印出一个字符串)。

Ceylon 和 GraalVM 版本:

ceylon version 1.3.3 0d594b3 (Contents May Differ)

java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) GraalVM EE 1.0.0-rc13 (build 25.202-b08-jvmci-0.55, mixed mode)

完整错误日志:

Error: com.oracle.graal.pointsto.constraints.UnsupportedFeatureException: Unsupported method java.lang.Class.getConstantPool() is reachable: The declaring class of this element has been substituted, but this element is not present in the substitution class
To diagnose the issue, you can add the option --report-unsupported-elements-at-runtime. The unsupported element is then reported at run time when it is accessed the first time.
Detailed message:
Error: com.oracle.graal.pointsto.constraints.UnsupportedFeatureException: Unsupported method java.lang.Class.getConstantPool() is reachable: The declaring class of this element has been substituted, but this element is not present in the substitution class
To diagnose the issue, you can add the option --report-unsupported-elements-at-runtime. The unsupported element is then reported at run time when it is accessed the first time.
Trace: 
        at parsing java.lang.System$2.getConstantPool(System.java:1227)
Call path from entry point to java.lang.System$2.getConstantPool(Class): 
        at java.lang.System$2.getConstantPool(System.java:1227)
        at java.lang.reflect.Method.getDefaultValue(Method.java:609)
        at com.redhat.ceylon.model.loader.impl.reflect.mirror.ReflectionMethod.isDefault(ReflectionMethod.java:263)
        at com.redhat.ceylon.model.loader.AbstractModelLoader.addMethod(AbstractModelLoader.java:3810)
        at com.redhat.ceylon.model.loader.AbstractModelLoader.complete(AbstractModelLoader.java:3247)
        at com.redhat.ceylon.model.loader.AbstractModelLoader.access$1100(AbstractModelLoader.java:103)
        at com.redhat.ceylon.model.loader.AbstractModelLoader$18.run(AbstractModelLoader.java:2616)
        at java.lang.Shutdown.runHooks(Shutdown.java:123)
        at java.lang.Shutdown.sequence(Shutdown.java:167)
        at java.lang.Shutdown.shutdown(Shutdown.java:234)
        at com.oracle.svm.core.jdk.RuntimeSupport.shutdown(RuntimeSupport.java:181)
        at com.oracle.svm.core.JavaMainWrapper.run(JavaMainWrapper.java:177)
        at com.oracle.svm.core.code.IsolateEnterStub.JavaMainWrapper_run_5087f5482cc9a6abc971913ece43acb471d2631b(generated:0)

Error: Use -H:+ReportExceptionStackTraces to print stacktrace of underlying exception
Error: Processing image build request failed

最佳答案

至少对于由 ceylon new hello-world 生成的简单“hello world”程序,添加 --report-unsupported-elements-at-runtime 选项(正如错误消息所建议的那样)足以使程序运行:

$ ./com.example.helloworld-1.0.0
Hello, World!

我依稀记得不久前在ceylon.formatter中使用过这个,我认为它当时也有效(即它不只是支持非常简单的程序),尽管我不记得它的性能是否比正常运行更好或更差。

关于ceylon - 如何为 Ceylon 生成 GraalVM 原生镜像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55067405/

相关文章:

ceylon - 泛型类中的方法可以返回与其参数列表具有相同类型的元组吗?

java - Java 11 的 Nashorn 替代品

graalvm - 是否可以将预编译的js存储并加载到org.graalvm.polyglot.Context

java - 有没有办法使用 java 对象作为函数的参数并在 GraalJS 中返回所述对象的值之一?

java - 无法在 Windows 上使用 native 镜像编译简单的 "Hello World"Java 应用程序

java - 从 Java(或 scala)调用具有类型参数的 Ceylon 顶级函数

packaging - 我如何在 ceylon 创建一个 super jar

不同版本的 Ceylon 模块?

java - 相当于 graal.js 脚本引擎中 Nashorn 的 importPackage