Quarkus中Kotlin lazy属性及Function1反射注册警告的解决方法咨询
问题场景
我使用Quarkus作为服务端框架开发Kotlin代码,定义了如下data class:
data class Location( val id: String, val serviceTimeInMinutes: Long, val openingTimes: List<OpeningTime>, ) { val sortedOpeningTimes: List<OpeningTime> by lazy { openingTimes.sortedWith { o1, o2 -> if (o1.weekday == o2.weekday) { o1.from.compareTo(o2.from) } else { o1.weekday.compareTo(o2.weekday) } } } }
运行./gradlew quarkusDev时出现如下警告:
2023-08-22 15:13:28,401 WARN [io.qua.dep.ste.ReflectiveHierarchyStep] (build-4) Unable to properly register the hierarchy of the following classes for reflection as they are not in the Jandex index: - kotlin.Lazy (source: <unknown>) - kotlin.jvm.functions.Function1 (source: <unknown>) Consider adding them to the index either by creating a Jandex index for your dependency via the Maven plugin, an empty META-INF/beans.xml or quarkus.index-dependency properties.
移除by lazy块将属性改为普通属性后,kotlin.Lazy的警告消失,但我希望保留懒执行逻辑,如何消除这两个警告?另外,我已知quarkus.index-dependency.<...>配置项,曾用它消除threeten库的同类警告,想知道Kotlin对应的group-id和artifact-id以便配置。
解决方案
方法一:通过quarkus.index-dependency配置索引Kotlin标准库
在项目的application.properties中添加以下配置:
quarkus.index-dependency.kotlin.group-id=org.jetbrains.kotlin quarkus.index-dependency.kotlin.artifact-id=kotlin-stdlib # 若使用JDK8,需追加classifier;其他JDK版本可省略 quarkus.index-dependency.kotlin.classifier=jdk8
如果使用YAML格式的配置文件(application.yml),则配置如下:
quarkus: index-dependency: kotlin: group-id: org.jetbrains.kotlin artifact-id: kotlin-stdlib classifier: jdk8 # 按需调整
该配置会让Quarkus将Kotlin标准库中的kotlin.Lazy、kotlin.jvm.functions.Function1等类纳入Jandex索引,彻底消除反射警告。
方法二:添加空的META-INF/beans.xml文件
在src/main/resources/META-INF目录下创建一个空的beans.xml文件,Quarkus会自动扫描并索引项目依赖的相关类,这种方式无需配置具体依赖,适合快速解决问题,但会扩大索引范围。
方法三:引入Quarkus Kotlin扩展优化处理
确保项目已引入Quarkus Kotlin扩展,它会自动处理部分Kotlin反射相关的索引需求。若未引入,在build.gradle中添加依赖:
implementation 'io.quarkus:quarkus-kotlin'
引入扩展后,配合上述quarkus.index-dependency配置,能更顺畅地处理Kotlin代码在Quarkus中的反射索引问题。
内容的提问来源于stack exchange,提问作者greyhairredbear
相关产品推荐
相关产品推荐

