目录
[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/webapp
或 target/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 资源目录,但这个目录在磁盘上根本不存在。
🚩一、错误的根本原因
这类报错通常由以下几种情况造成:
-
没有编译过项目 →
target/classes
目录还没生成也就是说你没有运行过:
mvn clean package
或者 IDEA 的 Build 没有执行。
-
src/main/webapp
路径缺失内嵌 Tomcat 默认会把
src/main/webapp
作为 Web 根目录。如果这个目录不存在,它会抛出:
NoSuchFileException: ...\src\main\webapp
-
你的 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 会找不到路径。