[BUG] Graalvm版本 构建native image后 运行报错
dongxicc opened this issue · comments
问题描述
2.0.2.graal 版本
以下代码出错
List ls = JSON.parseArray(strJson, MyClass.class);
环境信息
- OS信息:Arch Linux x86_64 Linux 5.15.37-1-lts
- JDK信息:OpenJDK Runtime Environment GraalVM CE 22.1.0
- 版本信息:2.0.2.graal
重现步骤
List<TVmess> ls = JSON.parseArray(strJson, MyClass.class);
期待的正确结果
能正确转成List
相关日志输出
com.oracle.svm.core.jdk.UnsupportedFeatureError: Defining hidden classes at runtime is not supported. at com.oracle.svm.core.util.VMError.unsupportedFeature(VMError.java:89) at java.lang.ClassLoader.defineClass0(ClassLoader.java:333) at java.lang.System$2.defineClass(System.java:2307) at java.lang.invoke.MethodHandles$Lookup$ClassDefiner.defineClass(MethodHandles.java:2439) at java.lang.invoke.MethodHandles$Lookup$ClassDefiner.defineClassAsLookup(MethodHandles.java:2420) at java.lang.invoke.MethodHandles$Lookup.defineHiddenClass(MethodHandles.java:2127) at java.lang.invoke.InnerClassLambdaMetafactory.generateInnerClass(InnerClassLambdaMetafactory.java:407) at java.lang.invoke.InnerClassLambdaMetafactory.spinInnerClass(InnerClassLambdaMetafactory.java:315) at java.lang.invoke.InnerClassLambdaMetafactory.buildCallSite(InnerClassLambdaMetafactory.java:228) at java.lang.invoke.LambdaMetafactory.metafactory(LambdaMetafactory.java:341) at com.alibaba.fastjson2.reader.ObjectReaderCreatorLambda.lambdaFunction(ObjectReaderCreatorLambda.java:264) at com.alibaba.fastjson2.reader.ObjectReaderCreatorLambda.createFieldReaderLambda(ObjectReaderCreatorLambda.java:249) at com.alibaba.fastjson2.reader.ObjectReaderCreatorLambda.createFieldReaderMethod(ObjectReaderCreatorLambda.java:195) at com.alibaba.fastjson2.reader.ObjectReaderCreator.createFieldReader(ObjectReaderCreator.java:789) at com.alibaba.fastjson2.reader.ObjectReaderCreator.lambda$createFieldReaders$4(ObjectReaderCreator.java:860) at com.alibaba.fastjson2.util.BeanUtils.setters(BeanUtils.java:225) at com.alibaba.fastjson2.reader.ObjectReaderCreator.createFieldReaders(ObjectReaderCreator.java:858) at com.alibaba.fastjson2.reader.ObjectReaderCreator.createObjectReader(ObjectReaderCreator.java:488) at com.alibaba.fastjson2.reader.ObjectReaderCreatorLambda.createObjectReader(ObjectReaderCreatorLambda.java:71) at com.alibaba.fastjson2.reader.ObjectReaderProvider.getObjectReader(ObjectReaderProvider.java:687) at com.alibaba.fastjson2.JSONReader$Context.getObjectReader(JSONReader.java:1987) at com.alibaba.fastjson2.reader.ObjectReaderImplList.readObject(ObjectReaderImplList.java:393) at com.alibaba.fastjson2.JSONReader.read(JSONReader.java:1025) at com.alibaba.fastjson2.JSON.parseArray(JSON.java:392) at com.mypkg.xxxxxxxx
jvm模式运行是正常的,native有问题
能否帮忙验证下2.0.2.android在native image后是否正常运行,因为我对graal native image还不够熟悉,需要你的帮助
我也不咋熟悉。。只是昨天写了个demo试了下native,发现有问题
我使用的是GraalVM CE 22.1 with Java 17.0.3,一切工作正常。 是不是你使用了Java 11?
样例代码如下,执行 jbang --verbose --native Hello.java
即可。
///usr/bin/env jbang "$0" "$@" ; exit $?
//JAVA 17
//DEPS io.goodforgod:graalvm-hint-processor:0.18.1
//DEPS io.goodforgod:graalvm-hint-annotations:0.18.1
//DEPS com.alibaba.fastjson2:fastjson2:2.0.2.graal
import com.alibaba.fastjson2.JSON;
import io.goodforgod.graalvm.hint.annotation.ReflectionHint;
import java.util.List;
public class Hello {
public static void main(String... args) throws Exception {
User user = new User(1, "雷卷");
// fastjson 2.0
String jsonText = JSON.toJSONString(List.of(user));
List<User> user2 = JSON.parseArray(jsonText, User.class);
System.out.println("Fastjson: " + user2.get(0).getNick());
}
}
@ReflectionHint
class User {
private Integer id;
private String nick;
public User() {
}
public User(Integer id, String nick) {
this.id = id;
this.nick = nick;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNick() {
return nick;
}
public void setNick(String nick) {
this.nick = nick;
}
}
我使用的是GraalVM CE 22.1 with Java 17.0.3,一切工作正常。 是不是你使用了Java 11?
样例代码如下,执行
jbang --verbose --native Hello.java
即可。///usr/bin/env jbang "$0" "$@" ; exit $? //JAVA 17 //DEPS io.goodforgod:graalvm-hint-processor:0.18.1 //DEPS io.goodforgod:graalvm-hint-annotations:0.18.1 //DEPS com.alibaba.fastjson2:fastjson2:2.0.2.graal import com.alibaba.fastjson2.JSON; import io.goodforgod.graalvm.hint.annotation.ReflectionHint; import java.util.List; public class Hello { public static void main(String... args) throws Exception { User user = new User(1, "雷卷"); // fastjson 2.0 String jsonText = JSON.toJSONString(List.of(user)); List<User> user2 = JSON.parseArray(jsonText, User.class); System.out.println("Fastjson: " + user2.get(0).getNick()); } } @ReflectionHint class User { private Integer id; private String nick; public User() { } public User(Integer id, String nick) { this.id = id; this.nick = nick; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getNick() { return nick; } public void setNick(String nick) { this.nick = nick; } }
昨天用原生又试了下,好像确实没问题,可能跟我一开始使用了quarkus框架有关系。打扰了