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 会找不到路径。

相关推荐
一定要AK2 小时前
Spring 入门核心笔记
java·笔记·spring
A__tao2 小时前
Elasticsearch Mapping 一键生成 Java 实体类(支持嵌套 + 自动过滤注释)
java·python·elasticsearch
xiaotao1312 小时前
第九章:Vite API 参考手册
前端·vite·前端打包
午安~婉2 小时前
Electron桌面应用聊天(续)
前端·javascript·electron
KevinCyao2 小时前
java视频短信接口怎么调用?SpringBoot集成视频短信及回调处理Demo
java·spring boot·音视频
迷藏4942 小时前
**发散创新:基于Rust实现的开源合规权限管理框架设计与实践**在现代软件架构中,**权限控制(RBAC)** 已成为保障
java·开发语言·python·rust·开源
彧翎Pro3 小时前
基于 RO1 noetic 配置 robosense Helios 32(速腾) & xsense mti 300
前端·jvm
小码哥_常3 小时前
解锁系统设置新姿势:Activity嵌入全解析
前端
之歆3 小时前
前端存储方案对比:Cookie-Session-LocalStorage-IndexedDB
前端
哟哟耶耶3 小时前
vue3-单文件组件css功能(:deep,:slotted,:global,useCssModule,v-bind)
前端·javascript·css