从WebLogic迁移至Tomcat后,Eclipse中JSPx调试断点失效
从WebLogic迁移到Tomcat9后XML风格JSP断点失效的解决办法
问题根源
你遇到的断点失效,本质是Tomcat与WebLogic对XML风格JSP的编译逻辑差异:
- Tomcat的JSP默认编译后继承
org.apache.jasper.runtime.HttpJspBase,这个类已经封装了Servlet生命周期方法(doGet/doPost等),负责JSP的运行时调度。 - 你在XML风格JSP中指定
extends="javax.servlet.http.HttpServlet",跳过了Tomcat的JSP运行时封装,导致<jsp:declaration>里的doGet要么没被Tomcat的请求逻辑触发,要么编译后的字节码和原JSP代码的断点映射关系断裂。
修复步骤
1. 移除错误的继承声明
删掉XML JSP中的<jsp:directive.page extends="javax.servlet.http.HttpServlet" />,让JSP默认继承Tomcat的HttpJspBase:
<?xml version="1.0" encoding="UTF-8" ?> <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:c="http://java.sun.com/jsp/jstl/core" version="2.3"> <jsp:declaration><![CDATA[// // 不要重写doGet/doPost,改用自定义方法 public void customHandle(HttpServletRequest req, HttpServletResponse resp) { System.out.println("hello custom method"); } //]]></jsp:declaration> </jsp:root>
2. 调整业务逻辑位置
如果需要处理GET请求逻辑,不要在<jsp:declaration>里重写doGet,改用以下方式:
- 直接用
<jsp:scriptlet>编写逻辑,断点可正常映射:
<?xml version="1.0" encoding="UTF-8" ?> <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:c="http://java.sun.com/jsp/jstl/core" version="2.3"> <jsp:scriptlet><![CDATA[ System.out.println("hello doGet"); // 断点可正常触发 ]]></jsp:scriptlet> </jsp:root>
- 规范做法是把请求处理逻辑抽离到自定义Servlet,JSP仅负责视图渲染,调试更顺畅。
3. 清理并重新部署
- 关闭Tomcat,删除Tomcat工作目录(默认路径
TOMCAT_HOME/work/Catalina/localhost/[你的应用名])下的编译文件,避免旧代码干扰。 - 在Eclipse中用Debug模式启动Tomcat,确保调试端口正常连接。
验证
修复后重启调试,触发请求检查断点是否正常命中。
内容的提问来源于stack exchange,提问作者Andrew Kim
相关产品推荐
相关产品推荐

