当前位置: 首页 > 知识库问答 >
问题:

Quarkus Graalvm本机应用ClassNotFoundException com。太阳xml。内部的ws。spi。ProviderImpl

桓宜
2023-03-14

我正在将Spring Boot应用程序转换为Quarkus,作为概念证明。当我构建Quarkus应用程序并用Java运行它时,它运行良好,但当我尝试将其作为本机应用程序运行时,我在内部sun类(com.sun.xml.internal.ws.spi.ProviderImpl)上得到一个ClassNotFoundException,因为它在Java中运行,我希望本机应用程序也能工作。

我正在使用:

  • Quarkus 1.3.0。期末考试
------------------------------------------------------------
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(插件号:nils.wsdl2java 0.12)
  • 我在构建中添加了以下内容。格拉德尔
   // 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 build命令是

./gradlew buildNative-i--stacktrace--docker build=true-Dquarkus。出生地的建筑商形象=码头。io/quarkus/ubi quarkus本机映像:19.3.1-java11

本机应用程序输出

我从ubi quarkus本机映像中运行应用程序

[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

当在相同的docker映像中使用Java启动时,它的工作原理符合预期

[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

我试过的

  • 谷歌:没有太多消息
  • 我确实发现有人提到添加com。太阳xml。ws:rt:2.3.2,但这会导致其他错误

有没有人想过要让它发挥作用?

共有3个答案

费明诚
2023-03-14

不能使用JVM的内部类。实现类是“私有”的,决不能在依赖JVM实现的痛苦中使用。这是JAVA的基础之一。您应该了解为什么要使用实现类而不是相应的接口。然后找到一个不依赖于任何实现,而只依赖于Java API的解决方案

狄奕
2023-03-14

我决定用CXF而不是JAX-WS来实现它,但遇到了同样的问题。解决方案是在META-INF/services中定义ProviderImpl,如下所示:

META-INF/services/javax.xml.ws.spi.Provider -> org.apache.cxf.jaxws.spi.ProviderImpl

此外,为了将此文件添加到本机映像,您需要将其作为额外资源提供:

1.在类路径中resources-config.json一个新文件:

{
  "resources": [
    {
      "pattern": "META-INF/services/.*"
    }
  ]
}

2.将该文件添加到quarkus maven插件,以便它使用它构建本机映像

    <plugin>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-maven-plugin</artifactId>
        <version>${quarkus-plugin.version}</version>
        <executions>
            <execution>
                <goals>
                    <goal>native-image</goal>
                </goals>
                <configuration>
                    <reportErrorsAtRuntime>true</reportErrorsAtRuntime>
                    <additionalBuildArgs>-H:+AllowIncompleteClasspath,
                                        -H:ReflectionConfigurationFiles=reflection-config.json, 
-H:ResourceConfigurationFiles=resources-config.json
                    </additionalBuildArgs>
                    <enableHttpUrlHandler>true</enableHttpUrlHandler>
                </configuration>
            </execution>
        </executions>
    </plugin>
游乐池
2023-03-14

我在提供商com上遇到了这个问题。太阳xml。内部的流动找不到XMLInputFactoryImpl

它似乎已经在GraalVM 20中解决了,我通过在应用程序中设置以下内容来解决这个问题。属性强制Quarkus根据GraalVm 20.0.0构建:

quarkus.native.builder-image=quay.io/quarkus/ubi-quarkus-native-image:20.0.0-java11
 类似资料:
  • 我需要访问JDK 11中的遗留SOAP网络服务。但是我正在遭受“找不到提供商” JDK11实现是:zulu11。2.3-jdk11。0.1-win_x64。 在我的build.gradle,我有以下依赖: 我看到: 以下https://github.com/javaee/metro-jax-ws/issues/1247我尝试设置: -贾瓦克斯。xml。ws。spi。Provider=com。太阳x

  • 我正在尝试用quarkus和graalvm构建一个java应用程序。我目前正在使用graalvm版本graalvm-ce-java11-windows-amd64-21.2.0,并更新了JAVA_HOME、graalvm_HOME和系统路径。对于MSVC,我已经下载了visual studio,并在安装过程中选择了MSVC选项。但是,当我使用mvn clean package-Pnative构建应

  • 我正试图将类从版本更新到更新的版本,以便与兼容,因为以下消息: JAVAlang.LinkageError:您正在尝试运行JAXB 2.0运行时(从jar:file:/opt/tomcat/appName/WEB-INF/lib/JAXB-runtime-2.3.1.jar!/com/sun/xml/bind/v2/model/impl/ModelBuilder.class),但在类路径的前面有旧

  • 我使用契约优先的方法来构建JAX-WS Webservice。客户端使用wsdlLoction属性从SO答案https://stackoverflow.com/a/18323853/775467中指定的客户端jar中选择wsdl和xsd资源。 在服务器端也可以这样做吗。i、 e是否可以在sun-jaxws.xml中使用wsdl和jar中引用的xsd 我知道我可以像上面的代码片段一样引用WEB-IN

  • 我的环境是一个Maven项目,Wildfly(8.2.1)作为应用服务器。我需要的是使用SOAP将传入REST调用中的wihin连接到第三方服务器。我需要SSL客户端身份验证;因此,我有自己的密钥库和信任库。因此,我创建了自己的SSLContext,需要让Web服务使用这个SSLContext。 Wildfly存在一个问题,它用于实现JAXWS(Apache CXF?)-我在这里描述了它(但用了另

  • 主要内容:1.Spi机制概述,2.代码分析,3.Spi机制的应用场景,4.ServiceLoader分析,5.Spi总结1.Spi机制概述 SPI ,全称为,是一种服务发现机制。它通过在ClassPath路径下的文件夹查找文件,自动加载文件里所定义的类。是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。 Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。 为什么不直接new而是用spi实现: 与我们java设计相关,系统