Java17升级报错Provider com.sun.xml.internal.ws.spi.ProviderImpl未找到求助
问题根源与解决方法
问题根源
没错,你内部库中META-INF/services/javax.xml.ws.spi.Provider文件的内容就是问题核心:
- Java 9开始推行模块化架构,
com.sun.xml.internal开头的包属于JDK内部私有API,在Java 17中已被完全移除/隐藏,不存在com.sun.xml.internal.ws.spi.ProviderImpl这个类。 - 即使你添加了
-Djavax.xml.ws.spi.Provider=com.sun.xml.ws.spi.ProviderImpl参数,服务加载机制会优先读取依赖库中META-INF/services目录下的配置文件,所以仍然会尝试加载那个不存在的internal类。
解决步骤
修正内部库的服务配置文件
找到内部库中的META-INF/services/javax.xml.ws.spi.Provider文件,将内容修改为:com.sun.xml.ws.spi.ProviderImpl去掉类名中的
internal后缀,指向公开的JAX-WS RI实现类。引入兼容Java 17的JAX-WS RI库
你需要引入GlassFish官方维护的JAX-WS参考实现(RI),这是替代JDK内部JAX-WS实现的标准方案:- Maven依赖配置:
<dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-rt</artifactId> <version>2.3.5</version> <!-- 推荐使用兼容Java 17的最新稳定版本 --> </dependency> <dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-api</artifactId> <version>2.3.3</version> </dependency> - Gradle依赖配置:
implementation 'com.sun.xml.ws:jaxws-rt:2.3.5' implementation 'com.sun.xml.ws:jaxws-api:2.3.3'
- Maven依赖配置:
临时替代方案(无法修改内部库时)
如果暂时无法修改内部库的配置文件,可以在你的主应用中添加一份相同的服务配置文件:
在应用的src/main/resources/META-INF/services/目录下创建javax.xml.ws.spi.Provider文件,内容同样写com.sun.xml.ws.spi.ProviderImpl。应用级的配置文件会覆盖依赖库中的配置,让服务加载机制优先读取正确的实现类。模块化应用额外配置
如果你的应用是Java模块化项目(带有module-info.java),需要在模块声明中添加:requires com.sun.xml.ws.jaxws.runtime; requires javax.xml.ws.api;
内容的提问来源于stack exchange,提问作者user3573403
相关产品推荐
相关产品推荐

