Skip to content

Type mismatch in ObjectStreamClass$Caches.localDescs with native image built with latest JDK 17 #4477

@galderz

Description

@galderz

GraalVM master native image fails when built with the very latest JDK 17 code. It throws an error like this:

Error: Type mismatch:
    interface java.util.concurrent.ConcurrentMap static java.util.concurrent.ConcurrentMap com.oracle.svm.core.jdk.Target_java_io_ObjectStreamClass_Caches.localDescs
    class java.io.ClassCache static final java.io.ClassCache java.io.ObjectStreamClass$Caches.localDescs
com.oracle.svm.core.util.UserError$UserException: Type mismatch:
    interface java.util.concurrent.ConcurrentMap static java.util.concurrent.ConcurrentMap com.oracle.svm.core.jdk.Target_java_io_ObjectStreamClass_Caches.localDescs
    class java.io.ClassCache static final java.io.ClassCache java.io.ObjectStreamClass$Caches.localDescs
	at com.oracle.svm.core.util.UserError.abort(UserError.java:72)
	at com.oracle.svm.core.util.UserError.guarantee(UserError.java:96)
	at com.oracle.svm.hosted.substitute.AnnotationSubstitutionProcessor.findOriginalField(AnnotationSubstitutionProcessor.java:829)
	at com.oracle.svm.hosted.substitute.AnnotationSubstitutionProcessor.handleFieldInAliasClass(AnnotationSubstitutionProcessor.java:497)
	at com.oracle.svm.hosted.substitute.AnnotationSubstitutionProcessor.handleAliasClass(AnnotationSubstitutionProcessor.java:401)
	at com.oracle.svm.hosted.substitute.AnnotationSubstitutionProcessor.handleClass(AnnotationSubstitutionProcessor.java:368)
	at com.oracle.svm.hosted.substitute.AnnotationSubstitutionProcessor.init(AnnotationSubstitutionProcessor.java:324)
	at com.oracle.svm.hosted.NativeImageGenerator.createAnnotationSubstitutionProcessor(NativeImageGenerator.java:932)
	at com.oracle.svm.hosted.NativeImageGenerator.setupNativeImage(NativeImageGenerator.java:845)
	at com.oracle.svm.hosted.NativeImageGenerator.doRun(NativeImageGenerator.java:554)
	at com.oracle.svm.hosted.NativeImageGenerator.run(NativeImageGenerator.java:514)
	at com.oracle.svm.hosted.NativeImageGeneratorRunner.buildImage(NativeImageGeneratorRunner.java:407)
	at com.oracle.svm.hosted.NativeImageGeneratorRunner.build(NativeImageGeneratorRunner.java:585)
	at com.oracle.svm.hosted.NativeImageGeneratorRunner.main(NativeImageGeneratorRunner.java:128)
	at com.oracle.svm.hosted.NativeImageGeneratorRunner$JDK9Plus.main(NativeImageGeneratorRunner.java:615)

This is caused by the commit in openjdk/jdk17u-dev@7d132f5.

GraalVM has a subsitution like this:

@TargetClass(value = java.io.ObjectStreamClass.class, innerClass = "Caches")
final class Target_java_io_ObjectStreamClass_Caches {

    @Alias @RecomputeFieldValue(kind = Kind.NewInstance, declClass = ConcurrentHashMap.class) static ConcurrentMap<?, ?> localDescs;

    @Alias @RecomputeFieldValue(kind = Kind.NewInstance, declClass = ConcurrentHashMap.class) static ConcurrentMap<?, ?> reflectors;

    @Alias @RecomputeFieldValue(kind = Kind.NewInstance, declClass = ReferenceQueue.class) private static ReferenceQueue<Class<?>> localDescsQueue;

    @Alias @RecomputeFieldValue(kind = Kind.NewInstance, declClass = ReferenceQueue.class) private static ReferenceQueue<Class<?>> reflectorsQueue;
}

But the JDK 17 API has changed and the type of localDescs is now ClassCache instead of ConcurrentMap.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions