artifacts 配置入口不可用是因为项目未识别为 web 项目,需通过 add framework support 添加 web application 框架;war exploded 用于本地调试支持热更新,war 用于导出部署;deployment 为空说明 artifact 未创建成功,需手动添加;classnotfoundexception 多因 servlet 版本与 tomcat 不匹配或 scope 未设为 provided。

找不到 Artifacts 配置入口?先确认项目类型是否为「Java Enterprise」
IntelliJ IDEA 不会自动把普通 Java 项目识别为 Web 项目,也就不会显示 Artifacts 配置页。你看到的「Project Structure → Artifacts」是灰色不可点,大概率是因为项目没带 Web 模块或缺少 web.xml / src/main/webapp 结构。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 右键项目根目录 → Add Framework Support… → 勾选
Web Application(注意:IDEA 2022.3+ 默认带Web Application (Java EE)和Web Application (Jakarta EE),选哪个取决于你用的是 Servlet 4.x 还是 5.x+) - 勾选后,IDEA 会自动生成
src/main/webapp/WEB-INF/web.xml(如未存在),并把该目录标记为Resources Root - 如果已有
webapp目录但没被识别,右键它 → Mark Directory as → Resources Root(不是Web Resource Directory,那个已废弃)
Artifact 类型选错导致部署失败:war vs war exploded 的真实区别
很多人以为 war exploded 是“开发用”,war 是“上线用”,其实核心差异在类加载路径和热更新行为——不是用途问题,而是部署机制问题。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 本地调试 Tomcat 时,必须用
war exploded:它把classes、lib、webapp目录直接映射进 Tomcat 的webapps/xxx/下,改完 class 文件能被 Tomcat 实时重载(配合On 'Update' action → Update classes and resources) - 选
war类型只适合导出包给其他环境部署,IDEA 启动 Tomcat 时会把它解压到临时目录,但修改 class 后不会触发重载,容易误以为“代码没生效” - 检查
Output Layout标签页:确保Available Elements里有你的compiled classes和WEB-INF/lib;若缺依赖 jar,手动拖进去,别只靠 Maven 自动导入(尤其用了systemscope 或本地 jar)
Tomcat 配置里 Deployment 标签为空?Artifact 没生成成功
点开 Run → Edit Configurations → Tomcat Server → Deployment,列表为空,不是 IDEA 抽风,而是 Artifacts 根本没构建出来——常见于 Maven 多模块项目或手动删过 .idea/artifacts/。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 先去
Project Structure → Artifacts看右侧有没有你命名的 artifact(比如myweb:war exploded)。没有?点+→Web Application: Exploded → From modules…,选中含web.xml或@SpringBootApplication的 module - 如果 module 下拉为空,说明该 module 没被识别为 Web 模块(回到第一个副标题检查)
- 确认 artifact 名称不带空格或中文;IDEA 对含空格的 artifact 名解析异常,会导致 Deployment 列表无法加载
- 配置好 artifact 后,**必须点右下角
OK保存**,再回到 Run Configurations 才会刷新 Deployment 列表
启动报 java.lang.ClassNotFoundException: javax.servlet.Filter?依赖范围和 Servlet 版本对不上
这错误不是缺 jar,而是 IDEA 把 provided 范围的依赖(如 javax.servlet-api)当成了运行时依赖,或者 Tomcat 自带的 servlet 版本和你代码里 import 的包不兼容。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 如果你用的是 Tomcat 9.x 或更早版本,Maven 依赖必须是
javax.servlet:javax.servlet-api:4.0.1;Tomcat 10+ 强制 Jakarta EE 9+,要换成jakarta.servlet:jakarta.servlet-api:5.0.0,否则所有javax.*包全报 CNFE - 在
Project Structure → Modules → Dependencies里,找到 servlet api 依赖,Scope 必须设为Provided(不是 Compile);否则 IDEA 会把它打进 war,而 Tomcat 启动时因双份 servlet 类冲突直接拒绝加载 - 检查
Artifact → Output Layout:展开WEB-INF/lib,确认里面没有servlet-api-*.jar—— 如果有,说明 Scope 没设对,或者用了system路径硬引入
最常被忽略的一点:Tomcat 的 lib 目录里如果有老版本 servlet-api.jar,而你的项目又打了新版本进去,冲突会静默发生,现象就是 Filter 加载失败但控制台不报具体冲突原因。动手前先清干净 Tomcat 的 lib。










