idea中jdk配置不生效需检查java_home与项目sdk是否一致,tomcat 11启动失败须确保jdk≥17,部署失败要手动配置artifact,404错误需核对上下文路径和index.jsp位置。

IDEA 里 JDK 配置不生效?检查 JAVA_HOME 和项目 SDK 是否一致
很多人配完系统级 JAVA_HOME,却忘了在 IDEA 里手动指定项目用的 JDK。这两者是独立的:系统变量只影响命令行和 Tomcat 启动脚本,IDEA 默认用的是自己项目结构里选的 SDK。
实操建议:
- 打开
File → Project Structure → Project,确认Project SDK已指向你安装的 JDK(比如D:\jdk-17或/usr/lib/jvm/jdk-24) - 如果列表为空,点
+ → Add JDK,手动选择 JDK 根目录(不是bin子目录) - 顺手检查
Project language level是否匹配——JDK 17 项目别设成 8,否则var、switch表达式会报错 - 模块(Modules)页里也要核对每个 module 的
Language level和Dependencies → Module SDK
Tomcat 11 在 IDEA 中启动失败?先确认 JDK 版本是否 ≥17
Tomcat 11.0.18 要求最低 JDK 17,用 JDK 11 或 8 会直接抛 UnsupportedClassVersionError,日志里看到类似 class file version 61.0 就是 JDK 17 编译的字节码,老 JDK 解析不了。
实操建议:
- 在 IDEA 的
Run → Edit Configurations → Tomcat Server → Server页,点击JRE下拉框,确保选的是 JDK 17+(不是 JRE) - 不要依赖系统
JAVA_HOME自动识别——IDEA 有时会读错,必须显式指定 - 若用 Tomcat 9/10,可放宽到 JDK 8/11,但注意 Servlet/JSP 规范差异:Tomcat 10+ 默认用 Jakarta EE 命名空间(
jakarta.servlet.*),不再是javax.servlet.*
添加 Web 模块后提示 “No artifacts marked for deployment”?立刻补上 Artifact
IDEA 不会自动为你生成部署构件(Artifact),哪怕你加了 Web 框架支持,没配 Artifact 就等于没告诉 IDEA “把哪些文件打包、怎么扔进 Tomcat”。运行时会卡在部署阶段,控制台可能只显示 “Deploying artifact…” 然后静默失败。
实操建议:
- 进
File → Project Structure → Artifacts,点+ → Web Application: Archive或Web Application: Exploded - 选中你的模块(如
study:war exploded),确保Output directory指向out/artifacts/...(不要手填绝对路径) - 在
Available Elements区域,右键WEB-INF/lib→Put into Output Root,确保依赖 JAR 被包含 - 回到运行配置,在
Deployment页点+ → Artifact,选刚建好的那个 exploded 或 war
浏览器打开 http://localhost:8080 返回 404?重点查上下文路径和 index.jsp 位置
不是所有请求都默认落到 index.jsp。IDEA 默认部署的上下文根(Context path)是项目名(如 /study),所以实际地址是 http://localhost:8080/study;如果设为空(/),才走 8080 根路径。
实操建议:
- 在运行配置的
Deployment页,看Application context值——留空即/,填/myapp就要访问http://localhost:8080/myapp -
index.jsp必须放在web目录下(不是src/main/webapp除非你改过路径),且该目录需被标记为Web Resource Directory(右键目录 →Mark Directory as → Web Resource Directory) - 如果用了 Maven,确认
pom.xml里packaging是war,且build → plugins没误删maven-war-plugin
out/artifacts/xxx_exploded/WEB-INF/classes 下的 class 文件又没重新编译,它就真没了——不像 war 包每次部署都覆盖。这点在热更新频繁时尤其关键。











