classpath 是 jvm 加载类时搜索的路径集合,配置错误会导致 classnotfoundexception 或 noclassdeffounderror;它决定类能否被找到,而非程序能否运行;优先级从高到低为:-cp 参数 > classpath 环境变量 > 默认当前目录。

Classpath 是 Java 加载类(.class 文件)时搜索的路径集合,配置错误会导致“ClassNotFoundException”或“NoClassDefFoundError”。它不决定 Java 程序能否运行,而是决定 JVM 能否找到你写的、引用的或第三方的类。
Classpath 的作用范围和优先级
Classpath 可在三个层级设置,按生效优先级从高到低:
- 命令行参数 -cp 或 -classpath(最高优先级,覆盖其他所有设置)
- 系统环境变量 CLASSPATH(全局生效,但不推荐设为全局)
- JVM 默认路径:当前目录(.),即未显式指定 classpath 时自动包含
注意:一旦设置了环境变量 CLASSPATH,JVM 就不再自动包含当前目录(除非你手动加进去),这是新手最常踩的坑。
Windows 下 CLASSPATH 环境变量配置方法
右键“此电脑”→“属性”→“高级系统设置”→“环境变量”,在“系统变量”或“用户变量”中新建/编辑:
- 变量名:CLASSPATH
- 变量值示例:.;C:\mylib\commons-lang3-3.12.0.jar;D:\project\classes
说明:
- . 表示当前目录,必须显式写上才有效
- 路径之间用英文分号 ; 分隔
- JAR 文件路径要写全名(含 .jar 后缀),目录路径则指向包含 .class 的根目录(如编译输出目录)
- 避免空格路径;如有,建议用短路径名或引号(但 CLASSPATH 环境变量本身不支持引号,应改用 -cp 方式)
更推荐的方式:用 -cp 参数临时指定
绕过环境变量,直接在运行时控制 classpath,更安全、清晰、可复现:
- 运行单个类:java -cp ".;lib/slf4j-api-2.0.9.jar" MyApp
- 运行含主类的 JAR:java -cp "app.jar;lib/*" com.example.Main(注意:通配符 * 在 Windows 和 Java 6+ 支持,匹配 lib 下所有 JAR)
- Linux/macOS 用冒号 : 分隔:java -cp ".:lib/gson-2.10.1.jar" Parser
优点:无需修改系统环境,不同项目互不影响,调试时易排查路径问题。
IDE 和构建工具中的 classpath 实际由谁管理?
你在 IntelliJ 或 Eclipse 里点“Run”,或执行 mvn exec:java,其实 IDE/Maven 已自动组装好 classpath 并传给 JVM。你看到的“Module Dependencies”或 pom.xml 中的
- Maven 默认 classpath 包含:target/classes(编译结果)、target/test-classes、所有依赖 JAR(位于本地仓库或 target/lib)
- IntelliJ 的 “Edit Configurations” → “Modify options” → “Add VM options” 可手动追加 -cp,用于测试特殊路径
- 不要为了 IDE 能运行而强行配系统 CLASSPATH——那反而可能干扰命令行构建











