嵌入式Tomcat Java应用启动后无法访问,求问题排查方案
问题分析与解决方案
你的问题核心在于:你只是启动了Tomcat核心服务,但没有配置任何可对外提供服务的Web应用上下文(Context)和请求处理端点(比如Servlet)。Tomcat启动后,因为没有需要处理的Web应用实例,HTTP连接器并没有真正监听你设置的8888端口,这就是为什么netstat看不到端口开放、curl连接被拒绝的原因。
下面是修正后的代码,我会一步步解释关键改动:
import org.apache.catalina.Context; import org.apache.catalina.startup.Tomcat; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class Main { public static void main(String[] args) throws Exception { Tomcat tomcat = new Tomcat(); tomcat.setPort(8888); // 1. 创建根路径的Web应用上下文,指定临时目录作为资源目录(无需静态资源时临时目录完全够用) Context context = tomcat.addWebapp("", System.getProperty("java.io.tmpdir")); // 2. 定义一个简单的Servlet处理GET请求 HttpServlet helloServlet = new HttpServlet() { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType("text/plain"); resp.getWriter().write("Hello from embedded Tomcat!"); } }; // 注册Servlet并映射到根路径 "/" Tomcat.addServlet(context, "helloServlet", helloServlet); context.addServletMappingDecoded("/", "helloServlet"); tomcat.start(); tomcat.getServer().await(); } }
关键改动说明:
- 添加Web应用上下文:
tomcat.addWebapp("", System.getProperty("java.io.tmpdir"))为Tomcat默认Host添加了根路径的Web应用,这一步是让Tomcat明确知道需要为哪个路径提供服务,是激活端口监听的前提。 - 注册并映射Servlet:我们创建了一个极简的HttpServlet处理根路径的GET请求,通过映射配置告诉Tomcat:当收到
localhost:8888的请求时,用这个Servlet来处理。
依赖补充说明:
你的build.gradle依赖tomcat-embed-core:9.0.21足够运行这个示例,但如果之后需要支持JSP,需额外添加:
implementation 'org.apache.tomcat.embed:tomcat-embed-jasper:9.0.21'
现在运行修正后的代码,再用curl localhost:8888测试,应该能收到返回的文本,同时netstat -nlt也能看到8888端口处于监听状态了。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

