升级SOAP WebService遇javax.servlet.http.HttpServlet类找不到错误求助
解决Tomcat 10.1 + Jakarta EE 10环境下SOAP WebService的ClassNotFoundException错误
问题场景
从Tomcat 8.5/JDK 8环境升级SOAP WebService到NetBeans 20/OpenJDK 21/Tomcat 10.1.17,通过Ant创建项目并引入Metro、Jakarta EE 10 API库,但访问服务端点?wsdl时触发以下错误:
java.lang.ClassNotFoundException: javax.servlet.http.HttpServlet
原因分析
Tomcat 10+和Jakarta EE 10已将原Java EE的javax.*包迁移至jakarta.*命名空间,当前使用的Metro版本大概率依赖旧的javax.servlet类,与新环境的Jakarta规范不兼容,导致类加载失败。
解决方案
1. 升级Metro至Jakarta兼容版本
使用支持Jakarta EE 10的Metro 4.x版本(例如4.0.2),旧版Metro(如2.x)依赖javax.*包,无法在Tomcat 10+环境中正常工作。
2. 修正web.xml配置
取消注释并保留WSServletContextListener,确保Servlet类使用Jakarta适配版本:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="6.0" xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"> <listener> <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class> </listener> <servlet> <servlet-name>testhelloworld</servlet-name> <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>testhelloworld</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
3. 添加sun-jaxws.xml配置
在WEB-INF目录下创建sun-jaxws.xml,明确指定WebService实现类:
<?xml version="1.0" encoding="UTF-8"?> <endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0"> <endpoint name="testhelloworld" implementation="com.test.helloworld.testhelloworld" url-pattern="/hello"/> </endpoints>
4. 清理冲突依赖
- 移除项目中所有
javax.servlet-api相关依赖 - 确保仅保留Jakarta EE 10的
jakarta.servlet-api依赖,避免命名空间冲突
内容的提问来源于stack exchange,提问作者Mace
相关产品推荐
相关产品推荐

