alibaba / fastjson2

🚄 FASTJSON2 is a Java JSON library with excellent performance.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[BUG] Graalvm版本 构建native image后 运行报错

dongxicc opened this issue · comments

commented

问题描述

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

commented

jvm模式运行是正常的,native有问题

能否帮忙验证下2.0.2.android在native image后是否正常运行,因为我对graal native image还不够熟悉,需要你的帮助

commented

我也不咋熟悉。。只是昨天写了个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;
    }
}
commented

我使用的是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框架有关系。打扰了

你这里有没有解决,我最新版本的 2.0.8.graal,发现还是有问题,我采用Spring-native方式
image

commented

你这里有没有解决,我最新版本的 2.0.8.graal,发现还是有问题,我采用Spring-native方式 image

没,我用的quarkus框架 也是打包native image,也声明了反射,还是会报错,但是用原生不带框架,好像又可以

image
主要底层是调用通过class字节数组来构建一个Class出来,但是Native-images,它不支持动态的构建,我测试了这个方法,不管配置了资源文件,都是不行的,他类似动态加载一个class文件,那个是不支持的