Tomcat 内嵌启动时找不到 Web 应用的路径

目录

🚩一、错误的根本原因

✅二、标准解决流程

[1. 确认项目结构是否正确](#1. 确认项目结构是否正确)

[2. 编译项目](#2. 编译项目)

[3. 修改 Main.java 路径引用](#3. 修改 Main.java 路径引用)

[4. IDEA 运行配置](#4. IDEA 运行配置)


在使用Tomcat 内嵌启动时找不到 Web 应用的路径,如下页面所显示的webapp路径是我们需要去查找的路径,但在运行时出现报错"Caused by: java.lang.IllegalArgumentException: The directory specified by base and internal path [E:\program\java学习\target\classes\com\itranswarp\learnjava\servlet] does not exist."

这个错误信息其实很典型,说明------Tomcat 内嵌启动时找不到 Web 应用的路径(src/main/webapptarget/classes

看似报了很多行,其实核心原因就是一句:

复制代码
Caused by: java.lang.IllegalArgumentException: The directory specified by base and internal path [E:\program\java学习\target\classes\com\itranswarp\learnjava\servlet] does not exist.

也就是:Tomcat 启动时被告知要加载一个 Web 资源目录,但这个目录在磁盘上根本不存在


🚩一、错误的根本原因

这类报错通常由以下几种情况造成:

  1. 没有编译过项目target/classes 目录还没生成

    也就是说你没有运行过:

    复制代码
    mvn clean package

    或者 IDEA 的 Build 没有执行。

  2. src/main/webapp 路径缺失

    内嵌 Tomcat 默认会把 src/main/webapp 作为 Web 根目录。

    如果这个目录不存在,它会抛出:

    复制代码
    NoSuchFileException: ...\src\main\webapp
  3. 你的 Main.java 设置了错误的路径

    很多人在 Main.java 里写了类似:

    复制代码
    tomcat.addWebapp("/", new File("src/main/webapp").getAbsolutePath());

    但如果当前工作路径不对(例如从 IDEA 外部运行 jar),

    那么这个相对路径就指向一个根本不存在的目录。


✅二、标准解决流程

1. 确认项目结构是否正确

标准 Maven Web 项目应是这样的:(应该保证只打开这一个工程文件,不要打开多个工程文件,即以这一个工程作为根目录再IDEA中打开

复制代码
src/
 ├── main/
 │   ├── java/
 │   │    └── com/itranswarp/learnjava/servlet/...
 │   ├── resources/
 │   └── webapp/
 │        └── index.jsp
 └── test/

如果 webapp 不存在,请手动创建:

复制代码
src/main/webapp

哪怕暂时空着,也可以先放一个 index.jsp 以防启动时报错。


2. 编译项目

在项目根目录下执行:

复制代码
mvn clean package

这一步会生成:

复制代码
target/classes/com/itranswarp/learnjava/servlet/tomcat_servlet.class

如果 target/classes 仍为空,那说明 Maven 的 <build> 配置有问题(我可以帮你改)。


3. 修改 Main.java 路径引用

确保 Main 文件使用绝对路径,而不是相对路径。

推荐写法:

复制代码
package com.itranswarp.learnjava.servlet;

import org.apache.catalina.startup.Tomcat;

import java.io.File;

public class Main {
    public static void main(String[] args) throws Exception {
        Tomcat tomcat = new Tomcat();
        tomcat.setPort(8080);

        // 项目根路径(自动找到 webapp)
        String webappDirLocation = new File("src/main/webapp").getAbsolutePath();
        System.out.println("Webapp dir: " + webappDirLocation);

        tomcat.addWebapp("/", webappDirLocation);

        tomcat.start();
        tomcat.getServer().await();
    }
}

👉 如果你是通过 java -jar target/xxx.jar 启动的,那就不能用 src/main/webapp

因为打包后 JAR 中没有这个目录。此时你应使用:

复制代码
File webappDir = new File("target/classes/webapp");

或者更简单------不指定 webapp,直接注册 Servlet:

复制代码
tomcat.addContext("/", new File(".").getAbsolutePath());

4. IDEA 运行配置

  • 打开菜单:Run → Edit Configurations

  • 在 "Working directory" 一栏,设置为项目根目录(不是 src

    否则 Tomcat 会找不到路径。

相关推荐
寻星探路12 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
崔庆才丨静觅14 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
曹牧14 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
passerby606114 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了14 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅14 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅15 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
爬山算法15 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty72515 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎15 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven