Jakarta EE9配置H2 Console Servlet报类型不匹配如何解决
问题描述
我当前使用的依赖版本为 jakarta.jakartaee-api 9.1.0 和 H2 2.1.212。
当我尝试在web.xml文件中添加H2 Console Servlet配置时,出现如下错误:
'org.h2.server.web.WebServlet' is not assignable to 'javax.servlet.Servlet,jakarta.servlet.Servlet'
我的web.xml文件内容如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="5.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_5_0.xsd"> <data-source> <name>java:global/dataSource</name> <class-name>org.h2.jdbcx.JdbcDataSource</class-name> <url>jdbc:h2:mem:test;MODE=LEGACY</url> </data-source> <servlet> <servlet-name>H2Console</servlet-name> <servlet-class>org.h2.server.web.WebServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>H2Console</servlet-name> <url-pattern>/h2/*</url-pattern> </servlet-mapping> <servlet> <servlet-name>jakarta.ws.rs.core.Application</servlet-name> </servlet> <servlet-mapping> <servlet-name>jakarta.ws.rs.core.Application</servlet-name> <url-pattern>/api/*</url-pattern> </servlet-mapping> </web-app>
问题原因
报错的核心原因是Servlet规范包名不兼容:
- Jakarta EE 9 及以上版本将Servlet API的根包名从旧版的
javax.servlet迁移为jakarta.servlet - 你使用的H2 2.1.212版本中,
org.h2.server.web.WebServlet是基于旧版javax.servlet规范编译的,无法被Jakarta EE 9+的Servlet容器加载识别。
修复方案
你可以根据项目实际情况二选一:
- 方案1(推荐):升级H2版本至2.2.220及以上。从该版本开始H2官方提供了适配Jakarta Servlet规范的控制台Servlet类,类全限定名为
org.h2.server.web.JakartaWebServlet,你只需要将web.xml中H2控制台对应的servlet-class配置替换为该类即可,修改后的配置片段如下:
<servlet> <servlet-name>H2Console</servlet-name> <servlet-class>org.h2.server.web.JakartaWebServlet</servlet-class> </servlet>
其余配置不需要改动,重启服务即可正常访问H2控制台。
- 方案2:如果受项目依赖限制无法升级H2版本,可以将Jakarta EE版本降级至8(对应Servlet 4.0规范,使用
javax.servlet包名),同时同步修改web.xml的版本号、命名空间为Jakarta EE 8对应的配置。该方案需要调整项目中所有依赖Jakarta EE 9+新特性的代码,非必要不选择。
内容的提问来源于stack exchange,提问作者Mehdi Rahimi
相关产品推荐
相关产品推荐

