I'm trying to build a native executable in quarkus (version 3.2.1.Final
) but the build is failing during the initialisation step. I'm running:
mvn clean verify -Dnative -Dquarkus.native.container-build=true
and I'm getting:
Caused by: com.oracle.graal.pointsto.constraints.UnresolvedElementException:
Discovered unresolved type during parsing:
javax.annotation.Priority. This error is reported at image build
time because class org.javamoney.moneta.spi.PriorityAwareServiceProvider is
registered for linking at image build time by command line
Looking up those classes, javax.annotation.Priority
is used in PriorityAwareServiceProvider
.
Full error:
Fatal error: com.oracle.graal.pointsto.util.AnalysisError$ParsingError: Error encountered while parsing org.javamoney.moneta.spi.PriorityAwareServiceProvider$$Lambda$1019/0x00000001013c4000.compare(Unknown Source)
Parsing context:
at java.util.TimSort.binarySort(TimSort.java:296)
at java.util.TimSort.sort(TimSort.java:239)
at java.util.Arrays.sort(Arrays.java:1307)
at java.util.ArrayList.sort(ArrayList.java:1721)
at com.oracle.svm.common.option.CommonOptionParser.printFlags(CommonOptionParser.java:493)
at com.oracle.svm.core.option.RuntimeOptionParser.parseOptionAtRuntime(RuntimeOptionParser.java:161)
at com.oracle.svm.core.option.RuntimeOptionParser.parse(RuntimeOptionParser.java:128)
at com.oracle.svm.core.option.RuntimeOptionParser.parseAndConsumeAllOptions(RuntimeOptionParser.java:81)
at com.oracle.svm.core.graal.snippets.CEntryPointSnippets.initializeIsolate(CEntryPointSnippets.java:330)
at static root method.(Unknown Source)
at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.util.AnalysisError.parsingError(AnalysisError.java:149)
at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.MethodTypeFlow.createFlowsGraph(MethodTypeFlow.java:178)
at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.MethodTypeFlow.ensureFlowsGraphCreated(MethodTypeFlow.java:152)
at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.MethodTypeFlow.getOrCreateMethodFlowsGraphInfo(MethodTypeFlow.java:110)
at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.typestate.DefaultVirtualInvokeTypeFlow.onObservedUpdate(DefaultVirtualInvokeTypeFlow.java:113)
at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.TypeFlow.update(TypeFlow.java:583)
at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.PointsToAnalysis$1.run(PointsToAnalysis.java:474)
at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.util.CompletionExecutor.executeCommand(CompletionExecutor.java:187)
at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.util.CompletionExecutor.lambda$executeService$0(CompletionExecutor.java:171)
at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1395)
at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)
Caused by: org.graalvm.compiler.java.BytecodeParser$BytecodeParserError: com.oracle.graal.pointsto.constraints.UnresolvedElementException: Discovered unresolved type during parsing: javax.annotation.Priority. This error is reported at image build time because class org.javamoney.moneta.spi.PriorityAwareServiceProvider is registered for linking at image build time by command line
at parsing org.javamoney.moneta.spi.PriorityAwareServiceProvider.compareServices(PriorityAwareServiceProvider.java:72)
at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.throwParserError(BytecodeParser.java:2536)
at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.throwParserError(SharedGraphBuilderPhase.java:169)
at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.iterateBytecodesForBlock(BytecodeParser.java:3414)
at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.iterateBytecodesForBlock(SharedGraphBuilderPhase.java:712)
at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.handleBytecodeBlock(BytecodeParser.java:3366)
at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.processBlock(BytecodeParser.java:3208)
at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.build(BytecodeParser.java:1134)
at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.build(SharedGraphBuilderPhase.java:152)
at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.buildRootMethod(BytecodeParser.java:1026)
at jdk.internal.vm.compiler/org.graalvm.compiler.java.GraphBuilderPhase$Instance.run(GraphBuilderPhase.java:97)
at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.phases.SharedGraphBuilderPhase.run(SharedGraphBuilderPhase.java:114)
at jdk.internal.vm.compiler/org.graalvm.compiler.phases.Phase.run(Phase.java:49)
at jdk.internal.vm.compiler/org.graalvm.compiler.phases.BasePhase.apply(BasePhase.java:434)
at jdk.internal.vm.compiler/org.graalvm.compiler.phases.Phase.apply(Phase.java:42)
at jdk.internal.vm.compiler/org.graalvm.compiler.phases.Phase.apply(Phase.java:38)
at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.AnalysisParsedGraph.parseBytecode(AnalysisParsedGraph.java:146)
at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.meta.AnalysisMethod.parseGraph(AnalysisMethod.java:819)
at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.meta.AnalysisMethod.ensureGraphParsedHelper(AnalysisMethod.java:784)
at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.meta.AnalysisMethod.ensureGraphParsed(AnalysisMethod.java:767)
at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.phases.InlineBeforeAnalysisGraphDecoder.lookupEncodedGraph(InlineBeforeAnalysisGraphDecoder.java:120)
at jdk.internal.vm.compiler/org.graalvm.compiler.replacements.PEGraphDecoder.doInline(PEGraphDecoder.java:1190)
at jdk.internal.vm.compiler/org.graalvm.compiler.replacements.PEGraphDecoder.tryInline(PEGraphDecoder.java:1173)
at jdk.internal.vm.compiler/org.graalvm.compiler.replacements.PEGraphDecoder.trySimplifyInvoke(PEGraphDecoder.java:1028)
at jdk.internal.vm.compiler/org.graalvm.compiler.replacements.PEGraphDecoder.handleInvoke(PEGraphDecoder.java:982)
at jdk.internal.vm.compiler/org.graalvm.compiler.nodes.GraphDecoder.processNextNode(GraphDecoder.java:871)
at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.phases.InlineBeforeAnalysisGraphDecoder.processNextNode(InlineBeforeAnalysisGraphDecoder.java:186)
at jdk.internal.vm.compiler/org.graalvm.compiler.nodes.GraphDecoder.decode(GraphDecoder.java:600)
at jdk.internal.vm.compiler/org.graalvm.compiler.replacements.PEGraphDecoder.decode(PEGraphDecoder.java:854)
at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.phases.InlineBeforeAnalysis.decodeGraph(InlineBeforeAnalysis.java:77)
at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.parse(MethodTypeFlowBuilder.java:193)
at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.apply(MethodTypeFlowBuilder.java:583)
at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.MethodTypeFlow.createFlowsGraph(MethodTypeFlow.java:165)
... 13 more
Caused by: com.oracle.graal.pointsto.constraints.UnresolvedElementException: Discovered unresolved type during parsing: javax.annotation.Priority. This error is reported at image build time because class org.javamoney.moneta.spi.PriorityAwareServiceProvider is registered for linking at image build time by command line
at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.reportUnresolvedElement(SharedGraphBuilderPhase.java:521)
at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.reportUnresolvedElement(SharedGraphBuilderPhase.java:515)
at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.handleUnresolvedType(SharedGraphBuilderPhase.java:407)
at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.handleUnresolvedLoadConstant(SharedGraphBuilderPhase.java:318)
at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.genLoadConstant(BytecodeParser.java:3967)
at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.processBytecode(BytecodeParser.java:5167)
at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.iterateBytecodesForBlock(BytecodeParser.java:3406)
... 42 more
We are using org.javamoney.moneta:moneta-core
which depends on javax.annotation:javax.annotation-api
and at the same time io.quarkus:quarkus-core
uses jakarta.annotation
.
I also tried to register org.javamoney.moneta.spi.PriorityAwareServiceProvider
or javax.annotation.Priority
for reflection using the tips in the quarkus guides but didn't work either.
Dependency tree for reference:
org.acme:getting-started:jar:1.0.0-SNAPSHOT
+- io.quarkus:quarkus-amazon-lambda:jar:3.2.1.Final:compile
| \- io.quarkus:quarkus-amazon-lambda-common:jar:3.2.1.Final:compile
| +- com.amazonaws:aws-lambda-java-core:jar:1.2.2:compile
| +- com.amazonaws:aws-lambda-java-events:jar:3.11.2:compile
| +- io.quarkus:quarkus-jackson:jar:3.2.1.Final:compile
| | +- com.fasterxml.jackson.core:jackson-databind:jar:2.15.2:compile
| | +- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.15.2:compile
| | +- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:2.15.2:compile
| | \- com.fasterxml.jackson.module:jackson-module-parameter-names:jar:2.15.2:compile
| \- com.fasterxml.jackson.datatype:jackson-datatype-joda:jar:2.15.2:compile
| +- com.fasterxml.jackson.core:jackson-annotations:jar:2.15.2:compile
| +- com.fasterxml.jackson.core:jackson-core:jar:2.15.2:compile
| \- joda-time:joda-time:jar:2.10.14:compile
+- io.quarkiverse.amazonservices:quarkus-amazon-dynamodb:jar:2.4.1:compile
| +- io.quarkus:quarkus-core:jar:3.2.1.Final:compile
| | +- jakarta.annotation:jakarta.annotation-api:jar:2.1.1:compile
| | +- jakarta.enterprise:jakarta.enterprise.cdi-api:jar:4.0.1:compile
| | | +- jakarta.enterprise:jakarta.enterprise.lang-model:jar:4.0.1:compile
| | | +- jakarta.el:jakarta.el-api:jar:5.0.1:compile
| | | \- jakarta.interceptor:jakarta.interceptor-api:jar:2.1.0:compile
| | +- jakarta.inject:jakarta.inject-api:jar:2.0.1:compile
| | +- io.smallrye.common:smallrye-common-os:jar:2.1.0:compile
| | +- io.quarkus:quarkus-ide-launcher:jar:3.2.1.Final:compile
| | +- io.quarkus:quarkus-development-mode-spi:jar:3.2.1.Final:compile
| | +- io.smallrye.config:smallrye-config:jar:3.3.0:compile
| | | \- io.smallrye.config:smallrye-config-core:jar:3.3.0:compile
| | | +- org.eclipse.microprofile.config:microprofile-config-api:jar:3.0.3:compile
| | | +- io.smallrye.common:smallrye-common-annotation:jar:2.1.0:compile
| | | +- io.smallrye.common:smallrye-common-expression:jar:2.1.0:compile
| | | | \- io.smallrye.common:smallrye-common-function:jar:2.1.0:compile
| | | +- io.smallrye.common:smallrye-common-constraint:jar:2.1.0:compile
| | | +- io.smallrye.common:smallrye-common-classloader:jar:2.1.0:compile
| | | \- io.smallrye.config:smallrye-config-common:jar:3.3.0:compile
| | +- org.jboss.logging:jboss-logging:jar:3.5.1.Final:compile
| | +- org.jboss.logmanager:jboss-logmanager-embedded:jar:1.1.1:compile
| | +- org.jboss.logging:jboss-logging-annotations:jar:2.2.1.Final:compile
| | +- org.jboss.threads:jboss-threads:jar:3.5.0.Final:compile
| | +- org.slf4j:slf4j-api:jar:2.0.6:compile
| | +- org.jboss.slf4j:slf4j-jboss-logmanager:jar:2.0.0.Final:compile
| | +- org.graalvm.sdk:graal-sdk:jar:22.3.2:compile
| | +- org.wildfly.common:wildfly-common:jar:1.5.4.Final-format-001:compile
| | +- io.quarkus:quarkus-bootstrap-runner:jar:3.2.1.Final:compile
| | | +- io.smallrye.common:smallrye-common-io:jar:2.1.0:compile
| | | \- io.github.crac:org-crac:jar:0.1.3:compile
| | \- io.quarkus:quarkus-fs-util:jar:0.0.9:compile
| +- io.quarkus:quarkus-arc:jar:3.2.1.Final:compile
| | +- io.quarkus.arc:arc:jar:3.2.1.Final:compile
| | | +- jakarta.transaction:jakarta.transaction-api:jar:2.0.1:compile
| | | \- io.smallrye.reactive:mutiny:jar:2.3.1:compile
| | \- org.eclipse.microprofile.context-propagation:microprofile-context-propagation-api:jar:1.3:compile
| +- io.quarkiverse.amazonservices:quarkus-amazon-common:jar:2.4.1:compile
| | +- software.amazon.awssdk:sdk-core:jar:2.20.103:compile
| | | \- org.reactivestreams:reactive-streams:jar:1.0.4:compile
| | +- software.amazon.awssdk:aws-core:jar:2.20.103:compile
| | | \- software.amazon.eventstream:eventstream:jar:1.0.1:compile
| | +- software.amazon.awssdk:regions:jar:2.20.103:compile
| | +- software.amazon.awssdk:auth:jar:2.20.103:compile
| | \- software.amazon.awssdk:http-client-spi:jar:2.20.103:compile
| +- software.amazon.awssdk:dynamodb:jar:2.20.103:compile
| | +- software.amazon.awssdk:aws-json-protocol:jar:2.20.103:compile
| | | \- software.amazon.awssdk:third-party-jackson-core:jar:2.20.103:compile
| | +- software.amazon.awssdk:protocol-core:jar:2.20.103:compile
| | +- software.amazon.awssdk:profiles:jar:2.20.103:compile
| | +- software.amazon.awssdk:annotations:jar:2.20.103:compile
| | +- software.amazon.awssdk:utils:jar:2.20.103:compile
| | +- software.amazon.awssdk:metrics-spi:jar:2.20.103:compile
| | +- software.amazon.awssdk:json-utils:jar:2.20.103:compile
| | \- software.amazon.awssdk:endpoints-spi:jar:2.20.103:compile
| \- org.jboss.logging:commons-logging-jboss-logging:jar:1.0.0.Final:compile
\- org.javamoney.moneta:moneta-core:jar:1.4.2:compile
+- javax.money:money-api:jar:1.1:compile
\- javax.annotation:javax.annotation-api:jar:1.3.2:compile
and a reproducer
Not familiar with GraalVM or Quarkus native options, is there a way to actually work around the issue?
The solution proposed on #30466 fixes the error. It makes use of the Eclipse transformer through a very simple extension.
There's an example implementation here and check https://quarkus.io/guides/building-my-first-extension for help creating the extension template.
Create a new Quarkus extension and import it in the project's built tool.
The extension should have a @BuildStep
that reads the classes that use the javax
namespace and transform it to the jakarta
imports using the Eclipse transformer library. Example: https://github.com/quarkusio/quarkus/blob/48bd9c70563b7a41adb69ee80aff594d64e7870c/extensions/quartz/deployment/src/main/java/io/quarkus/quartz/deployment/JakartaEnablement.java
At the time of writing there's no built-in solution in the framework itself yet but only an enhancement proposal: #33145.