Lorsque je crée une image native pour mon application, j'ai des erreurs que je ne comprends pas.
[INFO] [io.quarkus.creator.phase.nativeimage.NativeImagePhase] /sandbox/Resources/GraalVm/graalvm-ce-1.0.0-rc15/bin/native-image -J-Djava.util.logging.manager=org.jboss.logmanager.LogManager -J-Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true -H:InitialCollectionPolicy=com.oracle.svm.core.genscavenge.CollectionPolicy$BySpaceAndTime -jar portfolio-app-1.0-SNAPSHOT-runner.jar -J-Djava.util.concurrent.ForkJoinPool.common.parallelism=1 -H:FallbackThreshold=0 -H:+PrintAnalysisCallTree -H:-AddAllCharsets -H:EnableURLProtocols=http,https --enable-all-security-services -H:NativeLinkerOption=-no-pie -H:-SpawnIsolates -H:+JNI --no-server -H:-UseServiceLoaderFeature -H:+StackTrace
Graal me conseille de définir cette option --report-unsupported-elements-at -runtime
J'ai lu le code de NativeImageMojo
J'essaye de mettre quelque chose comme:
<plugin> <groupId>io.quarkus</groupId> <artifactId>quarkus-maven-plugin</artifactId> <version>${quarkus.version}</version> <executions> <execution> <goals> <goal>native-image</goal> </goals> <configuration> <enableHttpUrlHandler>true</enableHttpUrlHandler> <containerRuntimeOptions>--report-unsupported-elements-at-runtime</containerRuntimeOptions> </configuration> </execution> </executions> </plugin>
Mais option n'apparaît pas:
Error: unsupported features in 3 methods Detailed message: Error: com.oracle.svm.hosted.substitute.DeletedElementException: Unsupported method java.lang.Class.getConstantPool() is reachable: The declaring class of this element has been substituted, but this element is not present in the substitution class
Comment puis-je ajouter --report-unsupported-elements-at-runtime? (J'ai utilisé Quarkus-bom 0.14.0 avec graalvm-ce-1.0.0-rc15)
3 Réponses :
Vous pouvez utiliser le paramètre additionalBuildArgs
:
<plugin> <groupId>io.quarkus</groupId> <artifactId>quarkus-maven-plugin</artifactId> <version>${quarkus.version}</version> <executions> <execution> <goals> <goal>native-image</goal> </goals> <configuration> <enableHttpUrlHandler>true</enableHttpUrlHandler> <additionalBuildArgs>--report-unsupported-elements-at-runtime</additionalBuildArgs> </configuration> </execution> </executions> </plugin>
Cela fonctionne bien aussi, il ajoute l'argument --report-unsupported-elements-at-runtime à GraalVm. Thx Oleg
Dans ce cas, la meilleure façon de le faire est d'utiliser:
<reportErrorsAtRuntime>true</reportErrorsAtRuntime>
Dans la configuration de votre objectif d'image native.
Cela fonctionne bien, ce paramètre ajoutant l'argument -H: + ReportUnsupportedElementsAtRuntime. Merci Guillaume
@bmeynier pouvez-vous s'il vous plaît accepter cette réponse si cela a fonctionné pour vous afin que les futurs lecteurs sachent facilement qu'elle est correcte sans avoir à lire les commentaires? Merci!
Vos deux propositions fonctionnent bien mais les stoud ne sont pas exactement les mêmes.
Option -H: + ReportUnsupportedElementsAtRuntime return:
Fatal error: java.lang.NoClassDefFoundError at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at java.util.concurrent.ForkJoinTask.getThrowableException(ForkJoinTask.java:598) at java.util.concurrent.ForkJoinTask.get(ForkJoinTask.java:1005) at com.oracle.svm.hosted.NativeImageGenerator.run(NativeImageGenerator.java:459) at com.oracle.svm.hosted.NativeImageGeneratorRunner.buildImage(NativeImageGeneratorRunner.java:288) at com.oracle.svm.hosted.NativeImageGeneratorRunner.build(NativeImageGeneratorRunner.java:422) at com.oracle.svm.hosted.NativeImageGeneratorRunner.main(NativeImageGeneratorRunner.java:108) Caused by: java.lang.NoClassDefFoundError: javax/security/jacc/PolicyContextException at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) at java.lang.Class.getDeclaredMethods(Class.java:1975) at com.oracle.svm.hosted.substitute.AnnotationSubstitutionProcessor.handleDeletedClass(AnnotationSubstitutionProcessor.java:437) at com.oracle.svm.hosted.substitute.AnnotationSubstitutionProcessor.handleClass(AnnotationSubstitutionProcessor.java:270) at com.oracle.svm.hosted.substitute.AnnotationSubstitutionProcessor.init(AnnotationSubstitutionProcessor.java:230) at com.oracle.svm.hosted.NativeImageGenerator.createDeclarativeSubstitutionProcessor(NativeImageGenerator.java:865) at com.oracle.svm.hosted.NativeImageGenerator.setupNativeImage(NativeImageGenerator.java:820) at com.oracle.svm.hosted.NativeImageGenerator.doRun(NativeImageGenerator.java:522) at com.oracle.svm.hosted.NativeImageGenerator.lambda$run$0(NativeImageGenerator.java:442) at java.util.concurrent.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1386) at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289) at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056) at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692) at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157) Caused by: java.lang.ClassNotFoundException: javax.security.jacc.PolicyContextException at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 15 more Error: Image build request failed with exit status 1
Option --report-unsupported-elements-at-runtime return:
Fatal error: java.lang.NoClassDefFoundError at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at java.util.concurrent.ForkJoinTask.getThrowableException(ForkJoinTask.java:598) at java.util.concurrent.ForkJoinTask.get(ForkJoinTask.java:1005) at com.oracle.svm.hosted.NativeImageGenerator.run(NativeImageGenerator.java:459) at com.oracle.svm.hosted.NativeImageGeneratorRunner.buildImage(NativeImageGeneratorRunner.java:288) at com.oracle.svm.hosted.NativeImageGeneratorRunner.build(NativeImageGeneratorRunner.java:422) at com.oracle.svm.hosted.NativeImageGeneratorRunner.main(NativeImageGeneratorRunner.java:108) Caused by: java.lang.NoClassDefFoundError: javax/security/jacc/EJBMethodPermission at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) at java.lang.Class.getDeclaredMethods(Class.java:1975) at com.oracle.svm.hosted.substitute.AnnotationSubstitutionProcessor.handleDeletedClass(AnnotationSubstitutionProcessor.java:437) at com.oracle.svm.hosted.substitute.AnnotationSubstitutionProcessor.handleClass(AnnotationSubstitutionProcessor.java:270) at com.oracle.svm.hosted.substitute.AnnotationSubstitutionProcessor.init(AnnotationSubstitutionProcessor.java:230) at com.oracle.svm.hosted.NativeImageGenerator.createDeclarativeSubstitutionProcessor(NativeImageGenerator.java:865) at com.oracle.svm.hosted.NativeImageGenerator.setupNativeImage(NativeImageGenerator.java:820) at com.oracle.svm.hosted.NativeImageGenerator.doRun(NativeImageGenerator.java:522) at com.oracle.svm.hosted.NativeImageGenerator.lambda$run$0(NativeImageGenerator.java:442) at java.util.concurrent.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1386) at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289) at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056) at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692) at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157) Caused by: java.lang.ClassNotFoundException: javax.security.jacc.EJBMethodPermission at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 15 more Error: Image build request failed with exit status 1
J'ai trouvé un peu de documentation
--report-unsupported-elements-at-runtime signale l'utilisation des méthodes et des champs non pris en charge au moment de l'exécution lors de leur premier accès, au lieu d'être une erreur lors de la création de l'image.
Je trouve des informations sur -H: + ReportUnsupportedElementsAtRuntime dans ce site Web
Signaler l'utilisation des méthodes et des champs non pris en charge lors de l'exécution sont accédés la première fois, au lieu d'une erreur pendant l'image bâtiment
La description est tout à fait la même mais je ne comprends pas pourquoi le retour est différent.
Par souci d'exhaustivité: j'obtenais exactement les mêmes classes javax.security.jacc
manquantes et la solution était d'ajouter la dépendance suivante: