Quarkus Graalvm Собственное приложение ClassNotFoundException com.sun. xml .internal.ws.spi.ProviderImpl - PullRequest
0 голосов
/ 26 марта 2020

Я конвертирую приложение Spring Boot в Quarkus, как доказательство концепции. Когда я собираю приложение Quarkus и запускаю его с Java, оно работает нормально, но когда я пытаюсь запустить его как нативное приложение, я получаю ClassNotFoundException для внутреннего класса Sun ( com.sun) . xml .internal.ws.spi.ProviderImpl ), так как он работает в Java Я бы ожидал, что Native App также будет работать.

Я использую:

  • Quarkus 1.3.0.final
  • Использование quay.io/quarkus/ubi-quarkus-native-image:19.3.1-java11
  • Который имеет openjdk version "11.0.6" 2020-01-14 OpenJDK Runtime Environment GraalVM CE 19.3.1 (build 11.0.6+9-jvmci-19.3-b07) OpenJDK 64-Bit Server VM GraalVM CE 19.3.1 (build 11.0.6+9-jvmci-19.3-b07, mixed mode, sharing)
  • Здание с Gradle
------------------------------------------------------------
Gradle 6.2
------------------------------------------------------------

Build time:   2020-02-17 08:32:01 UTC
Revision:     61d3320259a1a0d31519bf208eb13741679a742f

Kotlin:       1.3.61
Groovy:       2.5.8
Ant:          Apache Ant(TM) version 1.10.7 compiled on September 1 2019
JVM:          13.0.2 (AdoptOpenJDK 13.0.2+8)
OS:           Mac OS X 10.14.6 x86_64
  • В этом проекте используется WSDL (плагин no.nils.wsdl2 java 0.12)
  • И я добавил следующее в build.gradle
   // wsdl2java JDK9+
   implementation 'com.sun.xml.bind:jaxb-xjc:2.3.0.1'
   implementation 'javax.xml.bind:jaxb-api:2.3.1'
   implementation 'javax.xml.ws:jaxws-api:2.3.1'
   implementation 'org.apache.cxf:cxf-rt-wsdl:3.2.7'
   implementation 'javax.jws:javax.jws-api:1.1'
//    implementation 'com.sun.xml.ws:rt:2.3.2'

Команда сборки gradle:

. / gradlew buildNative -i --stacktrace - docker -build = true -Dquarkus .native.builder-image = quay.io / quarkus / ubi-quarkus-native-image: 19.3.1-java11

Вывод собственного приложения

Я запускаю приложение из ubi-quarkus-native-i маг

[quarkus@79a141991f90 build]$./my-service-1.0.0-SNAPSHOT-runner 
__  ____  __  _____   ___  __ ____  ______ 
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
2020-03-25 21:44:21,365 INFO  [com.che.es.eng.HealthAggregator] (main) Initializing health checks for 3 engines!
2020-03-25 21:44:21,370 ERROR [com.che.es.eng.ExEngine] (taskScheduler-0) Error from Ex web services!: javax.xml.ws.WebServiceException: Provider com.sun.xml.internal.ws.spi.ProviderImpl not found
    at javax.xml.ws.spi.FactoryFinder$1.createException(FactoryFinder.java:61)
    at javax.xml.ws.spi.FactoryFinder$1.createException(FactoryFinder.java:58)
    at javax.xml.ws.spi.ServiceLoaderUtil.newInstance(ServiceLoaderUtil.java:103)
    at javax.xml.ws.spi.FactoryFinder.find(FactoryFinder.java:112)
    at javax.xml.ws.spi.Provider.provider(Provider.java:96)
    at javax.xml.ws.Service.<init>(Service.java:112)
    at com.che.es.engine.wsdl.AddressValidationService.<init>(AddressValidationService.java:39)
    at com.che.es.engine.FedExHealthIndicator$FedExHealthCheckerTask.run(FedExHealthIndicator.java:70)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.lang.Thread.run(Thread.java:834)
    at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:497)
    at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:193)
Caused by: java.lang.ClassNotFoundException: com.sun.xml.internal.ws.spi.ProviderImpl
    at com.oracle.svm.core.hub.ClassForNameSupport.forName(ClassForNameSupport.java:60)
    at java.lang.ClassLoader.loadClass(Target_java_lang_ClassLoader.java:160)
    at javax.xml.ws.spi.ServiceLoaderUtil.nullSafeLoadClass(ServiceLoaderUtil.java:90)
    at javax.xml.ws.spi.ServiceLoaderUtil.safeLoadClass(ServiceLoaderUtil.java:123)
    at javax.xml.ws.spi.ServiceLoaderUtil.newInstance(ServiceLoaderUtil.java:101)
    ... 16 more
2020-03-25 21:44:21,377 INFO  [io.quarkus] (main) vs-service 1.0.0-SNAPSHOT (powered by Quarkus 1.3.0.Final) started in 0.191s. Listening on: http://0.0.0.0:8080

При запуске с Java на том же docker изображении оно работает как положено

[quarkus@79a141991f90 build]$ java -jar my-service-1.0.0-SNAPSHOT-runner.jar 
__  ____  __  _____   ___  __ ____  ______ 
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
2020-03-25 21:53:00,789 INFO  [com.che.es.eng.HealthAggregator] (main) Initializing health checks for 3 engines!
2020-03-25 21:53:01,841 INFO  [io.quarkus] (main) vs-service 1.0.0-SNAPSHOT (powered by Quarkus 1.3.0.Final) started in 3.720s. Listening on: http://0.0.0.0:8080

Что я пробовал

  • Google: не так уж и много
  • Я нашел упоминание о добавлении com.sun. xml .ws: rt: 2.3.2 , но это вызывает другие ошибки.

У кого-нибудь есть мысли по поводу того, как заставить это работать?

1 Ответ

0 голосов
/ 05 апреля 2020

Вы не можете использовать внутренние классы JVM. Классы реализации являются «частными» и никогда не должны использоваться под угрозой зависимости от реализации JVM. Это одна из основ JAVA. Вы должны выяснить, почему вы используете класс реализации вместо соответствующего интерфейса. А затем найдите решение, которое не зависит ни от какой реализации, а только от Java API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...