Java8迁移至Java17后Tomcat9部署遇ClassNotFoundException求助
问题原因分析
从错误栈java.lang.ClassNotFoundException: javax.xml.ws.WebServiceProvider可定位核心问题:
- 代码残留旧API引用:尽管已替换大部分
javax依赖为jakarta,但项目中仍存在javax.xml.ws.WebServiceProvider注解或相关类的引用,未替换为Jakarta EE对应的jakarta.xml.ws.WebServiceProvider。 - API缺失导致类加载失败:Java 17已完全移除JAX-WS(Java API for XML Web Services)相关的
javax.xml.ws包;而Tomcat 9本身不内置Jakarta XML Web Services的API与实现,运行时无法找到对应类。 - Tomcat版本兼容性不足:若使用的Tomcat 9版本低于9.0.60,会存在Java 17支持缺陷,引发类加载异常。
解决方法
1. 彻底替换旧API引用
全局搜索项目中所有javax.xml.ws相关代码,批量替换为Jakarta EE对应包:
- 将
import javax.xml.ws.WebServiceProvider;改为import jakarta.xml.ws.WebServiceProvider; - 同步替换其他JAX-WS相关注解/类(如
@WebService、@WebMethod、WebServiceContext等),确保所有相关引用从javax.xml.ws.*迁移到jakarta.xml.ws.*
2. 添加Jakarta JAX-WS依赖
在项目构建文件中添加JAX-WS的API与运行时实现依赖:
Maven配置
<!-- Jakarta JAX-WS API --> <dependency> <groupId>jakarta.xml.ws</groupId> <artifactId>jakarta.xml.ws-api</artifactId> <version>2.3.3</version> <scope>compile</scope> </dependency> <!-- JAX-WS 运行时实现(Metro) --> <dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-rt</artifactId> <version>2.3.5</version> <scope>runtime</scope> </dependency>
Gradle配置
implementation 'jakarta.xml.ws:jakarta.xml.ws-api:2.3.3' runtimeOnly 'com.sun.xml.ws:jaxws-rt:2.3.5'
3. 升级Tomcat 9版本
将Tomcat 9升级至9.0.60及以上版本,该版本开始正式支持Java 17,解决版本兼容引发的异常。
4. 验证编译与部署配置
- 确认项目编译级别设置为Java 17(IntelliJ中可通过
File > Project Structure > Project Settings > Project调整)。 - 检查Tomcat部署配置,确保运行时使用的JDK为Java 17,避免版本不匹配。
内容的提问来源于stack exchange,提问作者Parteek
相关产品推荐
相关产品推荐

