Java 10中java.xml.ws替代方案冲突问题排查与解决
解决JDK废弃
java.xml.ws模块与jaxws-ri依赖的冲突问题 错误原因解析
你遇到的错误本质是模块化路径冲突:
- 在Java 9及以上版本中,
java.xml.ws是JDK自带的废弃模块,从Java 11开始甚至被完全移除。 - 当你在
module-info.java中声明requires java.xml.ws;时,JVM会优先尝试加载JDK自带的这个模块,但你同时又引入了第三方的jaxws-ri实现——两者提供的核心包(比如javax.xml.ws.*、javax.jws.*)完全一致,模块化系统不允许这种重复依赖,因此抛出错误。
修复步骤
1. 调整module-info.java配置
直接移除requires java.xml.ws;,替换为依赖jaxws-ri的模块。jaxws-ri 2.3.0的模块名称是com.sun.xml.ws.jaxws_ri,所以你的模块声明应该改成:
module your.project.module { // 依赖jaxws-ri的完整模块,会自动传递依赖所需的API和实现 requires com.sun.xml.ws.jaxws_ri; // 如果你的代码直接用到了API包,也可以单独依赖API模块(可选) // requires javax.xml.ws.api; }
2. 确保Maven依赖配置正确
确认你的pom.xml中引入的jaxws-ri依赖是完整的,推荐使用pom类型的依赖来自动引入所有子模块:
<dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-ri</artifactId> <version>2.3.0</version> <type>pom</type> <scope>compile</scope> </dependency>
3. 额外适配Java 11+(如果适用)
如果你的项目运行在Java 11或更高版本,JDK已经完全移除了java.xml.ws模块,此时还需要确保你的Maven依赖中包含了JDK缺失的相关API(jaxws-ri的pom已经包含了这些,所以一般不需要额外添加),但如果遇到类找不到的问题,可以单独添加API依赖:
<dependency> <groupId>javax.xml.ws</groupId> <artifactId>jaxws-api</artifactId> <version>2.3.1</version> </dependency>
验证
修改完成后,重新编译项目:
- 模块化系统会优先加载你引入的jaxws-ri实现,而不是JDK自带的废弃模块(如果存在的话)。
- 检查代码中所有
javax.xml.ws.*相关的类是否正常引用,没有编译错误。
内容的提问来源于stack exchange,提问作者nllsdfx




