Tomcat10迁移后REST应用加载未启动,ApplicationConfig未执行
解决Jakarta EE 21 + Tomcat 10迁移后REST服务未启动(ApplicationConfig.getClasses()未调用)的问题
检查命名空间与导入类
确保ApplicationConfig继承的是jakarta.ws.rs.core.Application,而非旧的javax.ws.rs.core.Application。同时所有REST相关注解(@Path、@GET、@POST等)都要从jakarta.ws.rs包导入,NetBeans自动迁移可能存在遗漏,手动核对每个REST类的导入语句。补充Tomcat 10的REST依赖
Tomcat 10不内置Jakarta REST(JAX-RS)实现,必须手动添加依赖:- 若使用Maven,在
pom.xml中加入:<!-- Jakarta REST API --> <dependency> <groupId>jakarta.ws.rs</groupId> <artifactId>jakarta.ws.rs-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!-- Jersey 3.x 实现(也可替换为RESTEasy等其他实现) --> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet</artifactId> <version>3.1.5</version> </dependency> - 若为Ant项目,需将对应Jakarta REST的jar包放入
WEB-INF/lib,同时删除所有遗留的javax.ws.rs相关jar包。
- 若使用Maven,在
验证ApplicationConfig的注解与可见性
- 确保
ApplicationConfig是public类,且标注了@jakarta.ws.rs.ApplicationPath注解(比如@ApplicationPath("/api")),Tomcat依赖该注解识别REST应用入口。 - 确认
getClasses()方法为public修饰,返回的集合中完整包含所有REST资源类,无类名拼写错误或遗漏。
- 确保
检查web.xml配置(若存在)
若项目使用web.xml配置REST服务,需将servlet类替换为Jakarta适配版本(比如Jersey 3.x的org.glassfish.jersey.servlet.ServletContainer),同时确认servlet-mapping的url-pattern与@ApplicationPath配置一致,避免冲突。清理类加载冲突
- 检查
WEB-INF/lib下是否存在重复或冲突的jar包(如同时包含javax和jakarta版本的REST相关jar),直接删除冗余包。 - 清空Tomcat的
work目录,重新部署应用,避免旧编译缓存干扰类加载。
- 检查
开启调试日志排查
修改Tomcatconf/logging.properties,将以下日志级别设为FINE:jakarta.ws.rs.level = FINE org.apache.catalina.core.level = FINE重启Tomcat后查看日志,可获取REST应用初始化的详细过程,定位未扫描到
ApplicationConfig的具体原因。
内容的提问来源于stack exchange,提问作者Damien Mattei
相关产品推荐
相关产品推荐

