升级Java 8至Java 17后Web Service调用失败求助
解决Java 17调用WebService时
Provider com.sun.xml.internal.ws.spi.ProviderImpl not found错误 问题根源
从Java 9开始,JDK逐步移除了内置的JAX-WS(Java API for XML Web Services)相关实现,Java 11正式将其从JDK中剥离。你遇到的com.sun.xml.internal.ws.spi.ProviderImpl是JDK 8自带的JAX-WS实现类,在Java 17中已不存在,必须通过引入第三方JAX-WS实现来替代。
你之前添加的依赖版本过旧(如jaxws-rt:2.2.10是多年前的版本),且缺少部分核心依赖,导致无法正常加载Provider。
解决方案
1. 引入兼容Java 17的完整JAX-WS RI依赖
推荐使用最新稳定版的JAX-WS RI(Oracle/Sun维护的参考实现),以下是Maven依赖配置:
<dependencies> <!-- JAX-WS RI核心依赖,已包含streambuffer、stax-ex等必要依赖 --> <dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-rt</artifactId> <version>2.3.10</version> </dependency> <!-- 按需添加:如果业务需要处理Policy相关逻辑 --> <dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>policy</artifactId> <version>2.7.10</version> </dependency> </dependencies>
Gradle项目对应配置:
dependencies { implementation 'com.sun.xml.ws:jaxws-rt:2.3.10' implementation 'com.sun.xml.ws:policy:2.7.10' // 按需引入 }
2. 处理模块化项目(若使用module-info.java)
如果你的项目是Java模块化项目,需在module-info.java中声明依赖:
module your.module.name { requires com.sun.xml.ws.jaxws_rt; // 若用到Policy,补充: requires com.sun.xml.ws.policy; }
非模块化项目若遇模块加载问题,可在JVM启动参数中添加:
--add-modules com.sun.xml.ws.jaxws_rt
3. 可选:显式指定Provider实现
若仍出现Provider找不到的问题,可通过系统属性指定实现类:
- 启动参数方式:
-Djavax.xml.ws.spi.Provider=com.sun.xml.ws.spi.ProviderImpl
- 代码中设置:
System.setProperty("javax.xml.ws.spi.Provider", "com.sun.xml.ws.spi.ProviderImpl");
验证
添加依赖后重新构建运行项目,若仍有问题,可通过mvn dependency:tree(Maven)或gradle dependencies(Gradle)检查依赖树,排查是否存在旧版本JAX-WS依赖导致的冲突。
内容的提问来源于stack exchange,提问作者keystrokker
相关产品推荐
相关产品推荐

