Quarkus原生构建遇Vert.x Redis Client Random/SplittableRandom异常求助
UnsupportedFeatureException的解决方法 问题背景
在Quarkus应用原生构建过程中,使用Docker容器构建命令 ./mvnw package -Dnative -Dquarkus.native.container-build=true 时,Vert.x Redis Client多个类触发UnsupportedFeatureException: Detected an instance of Random/SplittableRandom异常。已通过pom.xml配置<quarkus.native.additional-build-args>将io.vertx.redis.client.impl.RedisSentinelClient设为运行时初始化,解决了部分异常,但仍卡在io.vertx.redis.client.impl.RedisClusterConnection.send(io.vertx.redis.client.Request)的解析错误上,尝试添加RedisClusterConnection、BaseRedisClient等类的运行时初始化配置后问题依旧。
核心原因
GraalVM原生构建会在构建阶段提前初始化部分类,而Random/SplittableRandom需要依赖运行时环境的熵源,无法在构建阶段完成初始化,因此需要将包含此类初始化逻辑的类指定为运行时初始化。
具体配置
由于RedisClusterConnection是接口,实际运行时的实例是其实现类io.vertx.redis.client.impl.RedisClusterConnectionImpl,需将该类添加到运行时初始化列表中:
修改pom.xml中的<quarkus.native.additional-build-args>配置:
<quarkus.native.additional-build-args> --initialize-at-run-time=io.vertx.redis.client.impl.RedisSentinelClient,io.vertx.redis.client.impl.RedisClusterConnectionImpl </quarkus.native.additional-build-args>
如果上述配置仍未解决问题,可以尝试将整个Vert.x Redis Client的内部实现包设为运行时初始化(适合快速排查,后续可根据异常栈缩小范围):
<quarkus.native.additional-build-args> --initialize-at-run-time=io.vertx.redis.client.impl </quarkus.native.additional-build-args>
验证
修改配置后,重新执行原生构建命令:
./mvnw package -Dnative -Dquarkus.native.container-build=true
进阶排查
若问题仍存在,查看完整异常栈信息,找到明确触发Random/SplittableRandom初始化的具体类,将其添加到--initialize-at-run-time参数中即可。
内容的提问来源于stack exchange,提问作者Murrah

