Как в плагине Quarkus maven я могу добавить параметр в GraalVM во время нативной компиляции?

Когда я создаю собственный образ для своего приложения, у меня возникают некоторые ошибки, которых я не понимаю.

    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

Грааль посоветует мне установить эту опцию --report-unsupported-elements-at-runtime

Я прочитал код NativeImageMojo

Пытаюсь поставить что-то вроде:

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

Но вариант не появляется:

[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

Как я могу добавить --report-unsupported-elements-at-runtime? (Я использовал Quarkus-bom 0.14.0 с graalvm-ce-1.0.0-rc15)


person bmeynier    schedule 26.04.2019    source источник


Ответы (3)


В этом случае лучше всего использовать:

<reportErrorsAtRuntime>true</reportErrorsAtRuntime>

В конфигурации вашего native-image target.

person Guillaume Smet    schedule 26.04.2019
comment
Он работает хорошо, этот параметр добавляет аргумент -H: + ReportUnsupportedElementsAtRuntime. Спасибо Гийом - person bmeynier; 27.04.2019
comment
@bmeynier, не могли бы вы принять этот ответ, если он сработал для вас, чтобы будущие читатели могли легко узнать, что он правильный, без необходимости читать комментарии? Спасибо! - person geoand; 03.05.2019

Вы можете использовать параметр 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>
person Oleg Šelajev    schedule 26.04.2019
comment
Он тоже хорошо работает, он добавляет в GraalVm аргумент --report-unsupported-elements-at-runtime. Спасибо Олег - person bmeynier; 27.04.2019

Два ваших предложения работают хорошо, но они не совсем то же самое.
Опция -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/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

Опция --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/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

Я нашел некоторую документацию

--report-unsupported-elements-at-runtime сообщает об использовании неподдерживаемых методов и полей во время выполнения, когда к ним обращаются в первый раз, а не как об ошибке во время построения образа.

Я нахожу информацию о -H: + ReportUnsupportedElementsAtRuntime на этом веб-сайте

Сообщать об использовании неподдерживаемых методов и полей во время выполнения при первом обращении к ним, а не как об ошибке во время построения изображения

Описание такое же, но я не понимаю, почему отдача отличается.

person bmeynier    schedule 27.04.2019
comment
Для полноты картины: я получал точно такие же отсутствующие классы javax.security.jacc, и решение заключалось в добавлении следующей зависимости: <dependency> <groupId>org.jboss.spec.javax.security.jacc</groupId> <artifactId>jboss-jacc-api_1.5_spec</artifactId> <!-- managed in io.quarkus:quarkus-bom --> </dependency> - person Peter Palaga; 09.05.2019
comment
спасибо @PeterPalaga, это тоже устранило мою проблему. Однако в моем случае я столкнулся со следующим java.lang.NoClassDefFoundError, на этот раз для com / sun / jna / LastErrorException. Можно исправить, добавив ‹dependency› ‹groupId› net.java.dev.jna ‹/groupId› ‹artifactId› jna-platform ‹/artifactId› ‹version› 5.3.1 ‹/version ‹›/dependency› - person mika; 04.05.2021