【问题标题】:ClassNotFoundException: com.sun.xml.internal.ws.spi.ProviderImplClassNotFoundException:com.sun.xml.internal.ws.spi.ProviderImpl
【发布时间】:2022-01-24 10:16:14
【问题描述】:

我已经在 build.gradle 文件中添加了所有相关的依赖项。尽管如此,当我尝试运行 Invoke SOAP 服务时仍然出现以下错误。共享依赖项部分和错误详细信息。使用 Java 11。互联网上已经有很多答案,但似乎都没有奏效。任何帮助/建议都将不胜感激。

dependencies {
    implementation 'org.codehaus.groovy:groovy-all:3.0.2'
    implementation 'javax.jws:javax.jws-api:1.1'

    cxfCodegen "jakarta.annotation:jakarta.annotation-api:1.3.5"
    cxfCodegen "jakarta.xml.ws:jakarta.xml.ws-api:2.3.3"
    cxfCodegen "jakarta.xml.bind:jakarta.xml.bind-api:2.3.3"

    //implementation 'org.apache.cxf:cxf-spring-boot-starter-jaxws:3.5.0'
    //implementation 'javax.xml.bind:jaxb-api:2.3.1'
    compile 'javax.xml.ws:jaxws-api:2.3.1'

    implementation 'com.sun.xml.messaging.saaj:saaj-impl:2.0.1'
    implementation 'javax.xml.soap:javax.xml.soap-api:1.4.0'
    implementation 'javax.xml.soap:saaj-api:1.3.5'

    implementation 'com.sun.xml.ws:jaxws-rt:3.0.2'
    implementation 'com.sun.xml.ws:rt:3.0.2'
    implementation 'com.sun.xml.ws:jaxws-ri:3.0.2'
}

低于错误堆栈跟踪

Exception in thread "main" 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.example.BLZService.<init>(BLZService.java:40)
    at dummypackage.DummySOAPClient.main(DummySOAPClient.java:21)
Caused by: java.lang.ClassNotFoundException: com.sun.xml.internal.ws.spi.ProviderImpl
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
Caused by: java.lang.ClassNotFoundException: com.sun.xml.internal.ws.spi.ProviderImpl

    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)
    ... 5 more

【问题讨论】:

    标签: java web-services gradle soap java-11


    【解决方案1】:

    A2A: 内部引用可能存在一些问题。

    你可以关注这个答案:JDK 11; JAX-WS; Provider com.sun.xml.internal.ws.spi.ProviderImpl not found

    基本上,答案是您也可以尝试包含较旧的 rt 依赖项:

    <dependency>
        <groupId>com.sun.xml.ws</groupId>
        <artifactId>rt</artifactId>
        <version>2.3.1</version>
    </dependency>
    

    以上是maven pom xml格式。

    这是给你的 gradle 格式:

    implementation 'com.sun.xml.ws:rt:2.3.1'
    

    这很可能会解决您的问题。

    编辑: 在下面的 cmets 中发表讨论:

    有效的依赖项是:

    implementation 'com.sun.xml.ws:jaxws-rt:2.3.2'
    implementation 'com.sun.xml.ws:rt:2.3.2'
    implementation 'com.sun.xml.ws:jaxws-ri:2.3.2'
    

    经过以上依赖后,出现了相关的错误

    com.sun.xml.internal.messaging.saaj.soap.SAAJMetaFactoryImpl not found

    可以使用兼容的 SAAJ 依赖解决:

    implementation 'com.sun.xml.messaging.saaj:saaj-impl:1.5.1'
    

    此外,在添加标头时,在添加上述 saaj 依赖项后向请求添加标头时存在问题:

    之前的代码:

    SOAPMessageContext context; 
    SOAPEnvelope envelope = context.getMessage().getSOAPPart().getEnvelope();
    SOAPHeader header = envelope.addHeader();
    

    更新的代码有效:

    SOAPHeader header = envelope.getHeader();
    

    有关 jaxws-rt 运行时依赖关系,请参阅以下链接:

    https://mvnrepository.com/artifact/com.sun.xml.ws/jaxws-rt/2.3.2

    【讨论】:

    • 改到下面之后,又得到一个异常。 {实现'com.sun.xml.ws:jaxws-rt:2.3.2'} {实现'com.sun.xml.ws:rt:2.3.2'} {实现'com.sun.xml.ws:jaxws -ri:2.3.2'} 错误。 :: javax.xml.soap.SOAPException:无法创建 SAAJ 元工厂:未找到提供程序 com.sun.xml.internal.messaging.saaj.soap.SAAJMetaFactoryImpl
    • 缺少的包是指“com.sun.xml.internal.ws.spi.ProviderImpl”,但可用的包是指“com.sun.xml.ws.spi.ProviderImpl”。 ..我有什么要补充的吗!!!!
    • 对于 saaj-impl 尝试实现 'com.sun.xml.messaging.saaj:saaj-impl:1.5.1'
    • 如果我使用上述版本的 saaj-impl,我的代码中会出现错误,例如当已经存在一个标头时无法添加标头...直到 1.5.3,如果我选择 2.0.0。 + 版本,SAAJMetaFctoryImpl 错误来了.... SOAPMessageContext context; SOAPEnvelope 信封 = context.getMessage().getSOAPPart().getEnvelope(); SOAPHeader 标头 = 信封.addHeader(); //// 此处出错
    • 我可以知道在哪里可以检查这种情况下的 jar 兼容性