升级Quarkus至3.14.4后构建原生镜像时出现类找不到错误
问题场景
将正常运行的Quarkus应用从3.12.1升级到3.14.4后,在Mac上执行以下命令构建原生容器镜像时:
./mvnw clean package -Dnative -DskipTests -Dquarkus.native.container-build=true -Dquarkus.container-image.build=true
出现如下错误:
java.lang.ClassNotFoundException: io.opentelemetry.sdk.internal.AndroidFriendlyRandomHolder
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageClassLoader.loadClass(NativeImageClassLoader.java:637)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:534)
at java.base/java.lang.Class.forName(Class.java:513)
at io.quarkus.runner.Feature.runtimeReinitializedClasses(Unknown Source)
at io.quarkus.runner.Feature.beforeAnalysis(Unknown Source)
at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.lambda$runPointsToAnalysis$9(NativeImageGenerator.java:773)
at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.FeatureHandler.forEachFeature(FeatureHandler.java:90)
at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.runPointsToAnalysis(NativeImageGenerator.java:773)
at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.doRun(NativeImageGenerator.java:592)
at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.run(NativeImageGenerator.java:550)
at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.buildImage(NativeImageGeneratorRunner.java:539)
at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.build(NativeImageGeneratorRunner.java:721)
at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.start(NativeImageGeneratorRunner.java:143)
at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.main(NativeImageGeneratorRunner.java:98)
降级回3.12.1后错误消失,再次升级到3.14.4则错误重现。
问题原因
该问题是Quarkus 3.14.4版本中OpenTelemetry SDK集成的兼容性问题:Quarkus 3.14.x升级了OpenTelemetry依赖版本,对应的GraalVM原生镜像构建配置未及时适配,导致AndroidFriendlyRandomHolder类未被正确包含到原生镜像中。已有其他用户反馈过此问题。
解决方案
方案1:升级到Quarkus 3.14.5或更高版本
Quarkus官方在后续小版本中修复了这个OpenTelemetry集成的bug,升级到3.14.5及以上版本即可解决问题,无需额外配置。
方案2:添加GraalVM原生构建参数
如果暂时无法升级Quarkus版本,可以通过配置强制让原生镜像包含缺失的类:
在pom.xml的<properties>节点中添加:
<quarkus.native.additional-build-args>--initialize-at-run-time=io.opentelemetry.sdk.internal.AndroidFriendlyRandomHolder</quarkus.native.additional-build-args>
若为反射访问问题,在src/main/resources/META-INF/native-image/reflect-config.json中添加反射配置:
[ { "name": "io.opentelemetry.sdk.internal.AndroidFriendlyRandomHolder", "allDeclaredConstructors": true, "allPublicConstructors": true, "allDeclaredMethods": true, "allPublicMethods": true, "allDeclaredFields": true, "allPublicFields": true } ]
方案3:排除OpenTelemetry扩展(如果应用不需要)
如果应用不依赖OpenTelemetry功能,可在pom.xml中排除相关依赖:
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-resteasy-reactive</artifactId> <exclusions> <exclusion> <groupId>io.quarkus</groupId> <artifactId>quarkus-opentelemetry</artifactId> </exclusion> </exclusions> </dependency>
内容的提问来源于stack exchange,提问作者Laurie Mann

