apache / camel-quarkus

Apache Camel Quarkus
https://camel.apache.org
Apache License 2.0
256 stars 189 forks source link

[Quarkus 2.10.0] Unable to build native image with XML JAXB extension #3838

Closed jamesnetherton closed 2 years ago

jamesnetherton commented 2 years ago

Whenever camel-quarkus-xml-jaxb is on the classpath it is not possible to successfully produce a native application.

Error: java.util.concurrent.ExecutionException: java.lang.NullPointerException: receiver is null
com.oracle.graal.pointsto.util.AnalysisError: java.util.concurrent.ExecutionException: java.lang.NullPointerException: receiver is null
        at com.oracle.graal.pointsto.util.AnalysisError.shouldNotReachHere(AnalysisError.java:172)
        at com.oracle.graal.pointsto.util.AnalysisFuture.ensureDone(AnalysisFuture.java:66)
        at com.oracle.graal.pointsto.heap.ImageHeapScanner.lambda$postTask$9(ImageHeapScanner.java:611)
        at com.oracle.graal.pointsto.util.CompletionExecutor.executeCommand(CompletionExecutor.java:193)
        at com.oracle.graal.pointsto.util.CompletionExecutor.lambda$executeService$0(CompletionExecutor.java:177)
        at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1426)
        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)
        at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183)
Caused by: java.util.concurrent.ExecutionException: java.lang.NullPointerException: receiver is null
        at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)
        at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191)
        at com.oracle.graal.pointsto.util.AnalysisFuture.ensureDone(AnalysisFuture.java:64)
        ... 9 more
Caused by: java.lang.NullPointerException: receiver is null
        at jdk.internal.vm.ci/jdk.vm.ci.hotspot.HotSpotConstantReflectionProvider.readFieldValue(HotSpotConstantReflectionProvider.java:175)
        at com.oracle.svm.core.meta.ReadableJavaField.readFieldValue(ReadableJavaField.java:40)
        at com.oracle.svm.hosted.substitute.ComputedValueField.readValue(ComputedValueField.java:312)
        at com.oracle.svm.hosted.ameta.AnalysisConstantReflectionProvider.readHostedFieldValue(AnalysisConstantReflectionProvider.java:128)
        at com.oracle.svm.hosted.heap.SVMImageHeapScanner.readHostedFieldValue(SVMImageHeapScanner.java:121)
        at com.oracle.graal.pointsto.heap.ImageHeapScanner.createImageHeapObject(ImageHeapScanner.java:265)
        at com.oracle.graal.pointsto.heap.ImageHeapScanner.lambda$getOrCreateConstantReachableTask$2(ImageHeapScanner.java:195)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at com.oracle.graal.pointsto.util.AnalysisFuture.ensureDone(AnalysisFuture.java:63)
        at com.oracle.graal.pointsto.heap.ImageHeapScanner.getOrCreateConstantReachableTask(ImageHeapScanner.java:207)
        at com.oracle.svm.hosted.heap.SVMImageHeapScanner.getOrCreateConstantReachableTask(SVMImageHeapScanner.java:94)
        at com.oracle.graal.pointsto.heap.ImageHeapScanner.markConstantReachable(ImageHeapScanner.java:171)
        at com.oracle.graal.pointsto.heap.ImageHeapScanner.onFieldValueReachable(ImageHeapScanner.java:333)
        at com.oracle.graal.pointsto.heap.ImageHeapScanner.lambda$createImageHeapObject$3(ImageHeapScanner.java:272)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at com.oracle.graal.pointsto.util.AnalysisFuture.ensureDone(AnalysisFuture.java:63)

I think it's related to https://github.com/quarkusio/quarkus/commit/3ff5a163633af6fc076f7ddf700a3c7c285f7b44 and specifically this code:

@Alias
@RecomputeFieldValue(kind = RecomputeFieldValue.Kind.FromAlias)
private Map<Class<? extends Annotation>, Map<Package, Annotation>> packageCache = new HashMap<>();

Similar to https://github.com/quarkusio/quarkus/issues/3300#issuecomment-653002628, I think creation of the JAXBContext in our xml-jaxb extension messes up the RecomputeFieldValue. It seems to work fine if it's changed to:

@RecomputeFieldValue(kind = RecomputeFieldValue.Kind.NewInstance, declClass = HashMap.class)
jamesnetherton commented 2 years ago

Looks like the fix I sent to Quarkus has got things working again. So I'll close this.