我可以在本机版本中将Kotlin Arrow库与Quarkus一起使用吗

我可以在本机版本中将Kotlin Arrow库与Quarkus一起使用吗,kotlin,quarkus,graalvm,graalvm-native-image,arrow-kt,Kotlin,Quarkus,Graalvm,Graalvm Native Image,Arrow Kt,我启动了一个新的Kotlin项目,我想将库与Quarkus(1.12.2)结合使用。我想在GraalVM中使用Quarkus的本机编译功能。我的第一个想法是arrow是一个没有反射的简单lib,但后来我读了。 由于GraalVm在运行时在本机可执行文件中存在反射问题,所以Arrow会有问题吗?如果这是一个问题,我可以通过简单地避免Arrow的一些特性来绕过这个问题吗 我知道我可以在Quarkus/GraalVM中标记类以进行反射。 通过反射检查哪些类?我可以简单地为几个类添加反射信息,还是需要为

我启动了一个新的Kotlin项目,我想将库与Quarkus(1.12.2)结合使用。我想在GraalVM中使用Quarkus的本机编译功能。我的第一个想法是arrow是一个没有反射的简单lib,但后来我读了。 由于GraalVm在运行时在本机可执行文件中存在反射问题,所以Arrow会有问题吗?如果这是一个问题,我可以通过简单地避免Arrow的一些特性来绕过这个问题吗

我知道我可以在Quarkus/GraalVM中标记类以进行反射。
通过反射检查哪些类?我可以简单地为几个类添加反射信息,还是需要为整个库或整个代码添加反射信息?

从即将发布的0.12.0开始,Arrow不使用反射。以前,它在monad理解中对访问
ContinuationUtils
类的
bind
操作中的MonadContinuation的所有继承者执行此操作。在这个类中,我们使用反射来读取和写入与延续堆栈标签相关的私有字段。

如前所述,较新版本可能不使用反射,这使得关于特定库的问题没有那么重要。然而,为了完整起见,这里是这些问题的一些一般答案

因为GraalVm在本地可执行文件中存在反射问题 运行时,这会是Arrow的问题吗

GraalVM native image在构建程序外的可执行文件时使用静态分析。这意味着langauge的动态特性需要显式配置,以帮助分析将必要的类/方法包含到二进制文件中。例如,静态分析无法预测哪些类将通过反射或代理进行访问,而这些类仅通过字符串进行引用,而这些字符串有时只能在运行时构造

我可以简单地为几个类添加反射信息,还是需要为整个库或整个代码添加反射信息

您确实需要通过反射API配置所有访问。这些库可以为它们使用反射、资源等提供配置。但是如果它们需要对应用程序类进行反射访问,那么它们就不能这样做

所需的配置是json文件的形式,例如,包含类的反射配置可能如下所示:

[
  {
    "name" : "java.lang.String",
    "fields" : [
      { "name" : "value", "allowWrite" : true },
      { "name" : "hash" }
    ],
    "methods" : [
      { "name" : "<init>", "parameterTypes" : [] },
      { "name" : "<init>", "parameterTypes" : ["char[]"] },
      { "name" : "charAt" },
      { "name" : "format", "parameterTypes" : ["java.lang.String", "java.lang.Object[]"] }
    ]
  }
]
然后,如果需要,您可以手动编辑配置,例如,推断出没有使用跟踪代理运行的代码路径

然后运行本机映像生成过程,并传递配置选项,例如,对于反射文件配置,请指定:
-H:reflectionConfiguration文件=/path/to/reflectconfig

您还可以使用以下事实:
META-INF/native image
目录是配置文件的默认位置,因此不必指定选项。例如,如果在
config/META-INF/native image
目录中生成配置,则可以将其放置在本机映像的类路径上,文件将自动拾取:

native-image -cp config -jar myjar.jar
native-image -cp config -jar myjar.jar