Graal: [native-image] GraalVM Java 11 native-image fails on repackaged Google Guava

Created on 4 Dec 2019  路  4Comments  路  Source: oracle/graal

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)
native-image

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

All 4 comments

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 :)

Was this page helpful?
0 / 5 - 0 ratings

Related issues

sxend picture sxend  路  3Comments

helloguo picture helloguo  路  3Comments

ghost picture ghost  路  3Comments

igor-ramazanov picture igor-ramazanov  路  3Comments

borkdude picture borkdude  路  3Comments