You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用@WebServlet注解启动Tomcat Servlet遇404问题求助

Servlet启动后访问404问题排查求助

环境信息

  • Tomcat 9.0.82
  • Corretto 11.0.17.8.1
  • Windows 10 19045.3570

WAR包目录结构

WAR
  - index.htm
  - img
    - some_images.gif
  - WEB-INF
    - web.xml
  - lib/my.jar
    - servlet.HelpServlet.class

web.xml配置内容

<?xml version="1.0" encoding="UTF-8"?>

<!-- Metadata-complete Attribute: If your web.xml contains the attribute 
  metadata-complete="true" in the  tag, this will instruct the server 
  to ignore annotations and use only the web.xml for deployment configuration. -->

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1" metadata-complete="false">

  <mime-mapping>
    <extension>wsdl</extension>
    <mime-type>text/xml</mime-type>
  </mime-mapping>
  
  <mime-mapping>
    <extension>xsd</extension>
    <mime-type>text/xml</mime-type>
  </mime-mapping>
</web-app>

Servlet定义代码

@WebServlet(
name = "HelpServlet",
urlPatterns = "/help/*")
public class HelpServlet extends javax.servlet.http.HttpServlet
{
private static final long serialVersionUID = -2877995723829943551L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {
        System.out.println("HELP PLEASE");
    }

}

Tomcat自定义配置

  • conf/server.xml:端口从8080改为6080,Host配置为 <Host name="localhost" appBase="../webapp/app" unpackWARs="true">
  • conf/Catalina/localhost/app.xml:
<?xml version="1.0" encoding="ISO-8859-15"?>
<Context docBase="D:/app-deploy/webapp/app.war" reloadable="false" />

问题描述

WAR包已部署到预期目录,index.htm可正常访问,但访问localhost:8080/app/help出现404错误。期望通过GET http://localhost:6080/app/help访问该Servlet,请求排查是否遗漏Servlet启动相关配置。


排查方向及修复建议

  1. 修正访问端口
    Tomcat端口已改为6080,测试时必须使用http://localhost:6080/app/help,而非原来的8080端口。

  2. 调整WAR包目录结构
    Tomcat仅会扫描WEB-INF/lib下的JAR包加载类,当前WAR根目录下的lib不符合规范,需将lib目录移至WEB-INF下,正确结构应为:

    WAR
      - WEB-INF
        - lib
          - my.jar
            - servlet
              - HelpServlet.class
    
  3. 解决Servlet注解扫描问题
    虽然web.xml中metadata-complete="false"允许注解扫描,但JAR包内的Servlet注解可能无法被Tomcat自动识别,可直接在web.xml中添加显式配置绕过注解扫描:

    <servlet>
        <servlet-name>HelpServlet</servlet-name>
        <servlet-class>servlet.HelpServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelpServlet</servlet-name>
        <url-pattern>/help/*</url-pattern>
    </servlet-mapping>
    
  4. 消除部署配置冲突
    server.xml的Host配置了appBase="../webapp/app",同时conf/Catalina/localhost/app.xml指定了独立的docBase,两种部署方式可能冲突。建议保留一种:要么将WAR包放到appBase指定的目录下,要么删除Host的appBase自定义配置,仅保留app.xml的Context配置。

  5. 查看Tomcat日志定位问题
    检查Tomcatlogs目录下的catalina.out或localhost.log,查看启动时是否有Servlet加载失败的报错(如类找不到、注解解析错误等),日志信息可直接定位核心问题。


内容的提问来源于stack exchange,提问作者Christian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 10:39:57