NoClassDefFoundError 是 JVM 运行时找不到类定义的异常,核心原因是编译时类存在而运行时类路径(classpath)配置错误,尤其在 JDK 17 中默认不包含当前目录,必须显式使用 -cp . 指定。

这个问题在 JDK 17 环境下非常典型,不是代码写错了,而是 JVM 找不到你编译出来的 .class 文件。核心原因就一个:类路径(classpath)没对上。下面几个关键点,覆盖了 90% 的实际场景。
确认当前目录下有正确的 .class 文件
JDK 17 默认不会自动搜索当前目录,必须显式告诉它“去哪找”。先用命令确认文件是否存在:
- 运行 dir *.class(Windows)或 ls *.class(macOS/Linux),看有没有你期望的类名对应的 .class 文件
- 如果没有,说明还没编译:用 javac YourClass.java 编译,注意大小写必须完全一致
- 如果源文件用了 package,比如 package com.example;,那编译后 .class 必须放在 com/example/YourClass.class 目录结构里,不能直接丢在当前目录
运行时必须加 -cp . 或指定类路径
JDK 17 不再默认把当前目录(.)加入 classpath。哪怕你在源文件所在目录下,也必须手动带上:
- 无包名:用 java -cp . YourClass,不能只写 java YourClass
- 有包名:比如类是 com.example.Main,且 Main.class 在 ./com/example/ 下,那就进到 .(即包含 com 文件夹的父目录),再运行 java -cp . com.example.Main
- 别依赖 CLASSPATH 环境变量——它容易被其他工具污染,命令行里明确写 -cp . 最可靠
检查是否误用了旧版启动方式
JDK 17 对模块系统和类加载更严格,一些老教程里的写法会失效:
- 不要在命令行里设置 CLASSPATH=. 再直接 java YourClass,这种写法在 JDK 17 中不可靠
- 避免用 java -jar app.jar 启动普通类——除非 jar 包 MANIFEST.MF 里明确定义了 Main-Class;否则应改用 java -cp app.jar YourMainClass
- Spring Boot 项目若报这个错,重点检查 mvn clean compile 是否成功、target/classes 下是否有对应包路径的 class 文件,而不是直接点 IDE 的运行按钮
验证 JDK 版本和 PATH 是否干净
多个 JDK 共存时,命令行调用的可能不是你认为的那个:
- 运行 java -version 和 where java(Windows)或 which java(macOS/Linux),确认路径指向的是 JDK 17 安装目录
- 如果显示的是 JRE 或旧版 JDK,说明 PATH 顺序有问题,需要把 JDK 17 的 bin 目录移到最前面
- 临时绕过环境变量验证:直接用完整路径运行,例如 "C:\zulu-17\bin\java.exe" -cp . YourClass

















