While trying to make a native image for a pretty large jar containing Google Guava, this error happened:
Fatal error: java.lang.reflect.GenericSignatureFormatError
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
at java.base/java.util.concurrent.ForkJoinTask.getThrowableException(ForkJoinTask.java:603)
at java.base/java.util.concurrent.ForkJoinTask.get(ForkJoinTask.java:1006)
at com.oracle.svm.hosted.NativeImageGenerator.run(NativeImageGenerator.java:462)
at com.oracle.svm.hosted.NativeImageGeneratorRunner.buildImage(NativeImageGeneratorRunner.java:315)
at com.oracle.svm.hosted.NativeImageGeneratorRunner.build(NativeImageGeneratorRunner.java:454)
at com.oracle.svm.hosted.server.NativeImageBuildServer.executeCompilation(NativeImageBuildServer.java:402)
at com.oracle.svm.hosted.server.NativeImageBuildServer.lambda$processCommand$8(NativeImageBuildServer.java:339)
at com.oracle.svm.hosted.server.NativeImageBuildServer.withJVMContext(NativeImageBuildServer.java:420)
at com.oracle.svm.hosted.server.NativeImageBuildServer.processCommand(NativeImageBuildServer.java:336)
at com.oracle.svm.hosted.server.NativeImageBuildServer.processRequest(NativeImageBuildServer.java:280)
at com.oracle.svm.hosted.server.NativeImageBuildServer.lambda$serve$7(NativeImageBuildServer.java:240)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.reflect.GenericSignatureFormatError: Signature Parse error: expected '<' or ';' or '.', got '/'.
Remaining input: /repackaged/com/google/common/cache/LocalCache$AbstractCacheSet<Ljava/util/Map$Entry<TK;TV;>;>;
at java.base/sun.reflect.generics.parser.SignatureParser.error(SignatureParser.java:124)
at java.base/sun.reflect.generics.parser.SignatureParser.parseSimpleClassTypeSignature(SignatureParser.java:356)
at java.base/sun.reflect.generics.parser.SignatureParser.parseClassTypeSignatureSuffix(SignatureParser.java:367)
at java.base/sun.reflect.generics.parser.SignatureParser.parseClassTypeSignature(SignatureParser.java:306)
at java.base/sun.reflect.generics.parser.SignatureParser.parseClassSignature(SignatureParser.java:213)
at java.base/sun.reflect.generics.parser.SignatureParser.parseClassSig(SignatureParser.java:156)
at java.base/sun.reflect.generics.repository.ClassRepository.parse(ClassRepository.java:57)
at java.base/sun.reflect.generics.repository.ClassRepository.parse(ClassRepository.java:41)
at java.base/sun.reflect.generics.repository.AbstractRepository.<init>(AbstractRepository.java:74)
at java.base/sun.reflect.generics.repository.GenericDeclRepository.<init>(GenericDeclRepository.java:49)
at java.base/sun.reflect.generics.repository.ClassRepository.<init>(ClassRepository.java:53)
at java.base/sun.reflect.generics.repository.ClassRepository.make(ClassRepository.java:70)
at java.base/java.lang.Class.getGenericInfo(Class.java:3027)
at java.base/java.lang.Class.getTypeParameters(Class.java:884)
at com.oracle.svm.hosted.analysis.Inflation.fillGenericInfo(Inflation.java:351)
at com.oracle.svm.hosted.analysis.Inflation.checkType(Inflation.java:146)
at java.base/java.lang.Iterable.forEach(Iterable.java:75)
at java.base/java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1085)
at com.oracle.svm.hosted.analysis.Inflation.checkObjectGraph(Inflation.java:132)
at com.oracle.graal.pointsto.BigBang.checkObjectGraph(BigBang.java:600)
at com.oracle.graal.pointsto.BigBang.finish(BigBang.java:559)
at com.oracle.svm.hosted.NativeImageGenerator.runPointsToAnalysis(NativeImageGenerator.java:687)
at com.oracle.svm.hosted.NativeImageGenerator.doRun(NativeImageGenerator.java:530)
at com.oracle.svm.hosted.NativeImageGenerator.lambda$run$0(NativeImageGenerator.java:445)
at java.base/java.util.concurrent.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1407)
at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
That seems to be an invalid generic signature in the code that you feed to native image: /repackaged/com/google/common/cache/LocalCache$AbstractCacheSet<Ljava/util/Map$Entry<TK;TV;>;>;. I don't think that the problem is with Guava but rather with the tool that is used to repackage the library; notice the /repackaged prefix.
I see that; I did more digging around, and I found this is used in Jersey libraries.
jersey-guava-2.25.jar repackages Guava, jersey-server-2.25.jar repackages ASM. These are pretty commonly used libraries. Their class files refer to jersey/repackaged/com/google/blah. However, are there workarounds for an issue like this?
I think the issue here is with the version of maven-shade that was use to build jersey .
2.25.1 - (2.2 ). I rebuilt the original jersey branch but bumped the shade plugin to version 3.2.1 and this problem did not appear.
so workaround I had was:
clone old jersey 2.x https://github.com/jersey/jersey
checkout tag 2.25.1
modify maven shade plugin version in top level pom.xml from 2.2 to 3.2.1
mvn install locally the bundles/repackaged/jersey-guava package
retry build
Thank you. Leaving this ticket here as documentation for the interested :)
Most helpful comment
I think the issue here is with the version of maven-shade that was use to build jersey .
2.25.1 - (2.2 ). I rebuilt the original jersey branch but bumped the shade plugin to version 3.2.1 and this problem did not appear.
so workaround I had was:
clone old jersey 2.x https://github.com/jersey/jersey
checkout tag 2.25.1
modify maven shade plugin version in top level pom.xml from 2.2 to 3.2.1
mvn install locally the bundles/repackaged/jersey-guava package
retry build