什么是 Classpath?
classpath(类路径)是 Java 虚拟机 用来查找类文件(.class 文件)的路径列表。

当你在 Java 代码中使用 import 语句(import java.util.ArrayList;)或者直接使用一个类(com.example.MyClass myObj = new com.example.MyClass();)时,JVM 需要知道去哪里寻找这些类的定义。classpath 就是告诉 JVM 这个“哪里”的指令。
一个简单的比喻:
想象一下你的电脑系统,当你在命令行输入 notepad 时,操作系统会去一个预设的“路径列表”(C:\Windows\System32)里寻找 notepad.exe 文件。classpath 对于 JVM 就是这样一个“文件查找路径列表”,只不过它找的是 .class 文件。
为什么需要 Classpath?
Java 项目通常由多个类组成,这些类可能位于不同的包(package)中,一个项目几乎总会依赖第三方库(Spring, MySQL Connector, Gson 等),这些库都是以 .jar 文件的形式存在的。
classpath 的作用就是:

- 定位项目自身的类文件:告诉 JVM 去哪个目录下找你的代码编译后生成的
.class文件。 - 定位依赖的库文件:告诉 JVM 去哪个
.jar文件中查找第三方库的类。
classpath 设置不正确,JVM 在运行时找不到所需的类,就会抛出经典的 ClassNotFoundException 或 NoClassDefFoundError 错误。
如何设置 Classpath?
在命令行中,主要有两种方式来设置 classpath:临时设置和永久设置。
A. 临时设置(推荐用于测试和简单运行)
这是最常见的方式,通过在 java 命令中使用参数来指定,仅在当前命令行窗口有效。
使用 -classpath 或 -cp 参数
-classpath 和 -cp 是完全等价的,-cp 只是一个更简短的别名,这是最推荐、最清晰的方式。

语法:
java -classpath "路径1;路径2;..." 包名.主类名 # 或者 java -cp "路径1;路径2;..." 包名.主类名
关键点:
- 路径分隔符:
- Windows: 使用分号
- Linux / macOS: 使用冒号
- 路径类型:路径可以是:
- 目录:指向包含
.class文件的根目录。 - JAR/WAR 文件:直接指向
.jar或.war文件。 - *通配符 `
(Java 6+)**:表示匹配目录下的所有.jar文件。**注意**:*` 不会递归查找子目录中的 JAR。
- 目录:指向包含
- 主类名:要运行的类的全限定名(包含包名),
com.example.MainApp。
实战示例
假设我们有以下项目结构:
my-project/
├── src/
│ └── com/
│ └── example/
│ ├── MainApp.java
│ └── Greeting.java
└── lib/
└── gson-2.10.1.jar (一个第三方库)
步骤 1:编译代码
我们需要把 src 目录下的所有 .java 文件编译到 bin 目录下。
# 创建一个输出目录 mkdir -p bin # 编译 src 目录下所有 java 文件,并将 .class 文件输出到 bin 目录 # -d bin: 指定输出目录 # -cp lib/gson-2.10.1.jar: 在编译时也需要依赖,所以告诉 javac 去哪里找 Gson javac -d bin -cp "lib/gson-2.10.1.jar" src/com/example/*.java
编译后,bin 目录结构如下:
my-project/
├── bin/
│ └── com/
│ └── example/
│ ├── MainApp.class
│ └── Greeting.class
├── src/
└── lib/
└── gson-2.10.1.jar
步骤 2:运行程序
现在我们来运行 MainApp.class。
只运行项目自己的代码
MainApp 只依赖 Greeting,它们都在 bin 目录下。
# Windows java -cp "bin" com.example.MainApp # Linux / macOS java -cp "bin" com.example.MainApp
这里,-cp "bin" 告诉 JVM 去当前目录下的 bin 文件夹里查找 com.example.MainApp 这个类。
运行需要依赖第三方库的代码
假设 MainApp.java 中使用了 Gson 库。
// src/com/example/MainApp.java
package com.example;
import com.google.gson.Gson; // 引用了 Gson 库
public class MainApp {
public static void main(String[] args) {
Greeting greeting = new Greeting("Hello from Classpath!");
String json = new Gson().toJson(greeting);
System.out.println(json);
}
}
你需要同时告诉 JVM 去哪里找你的代码(bin)和去哪里找 Gson 库(lib/gson-2.10.1.jar)。
# Windows java -cp "bin;lib/gson-2.10.1.jar" com.example.MainApp # Linux / macOS java -cp "bin:lib/gson-2.10.1.jar" com.example.MainApp
JVM 会按顺序在 bin 目录和 lib/gson-2.10.1.jar 文件中查找类。
*使用通配符 ``**
如果你的 lib 目录下有很多 JAR 文件,手动列出会很麻烦,可以使用 。
# 假设 lib 目录下还有 log4j-core.jar 等 # Windows java -cp "bin;lib/*" com.example.MainApp # Linux / macOS java -cp "bin:lib/*" com.example.MainApp
lib/* 会自动匹配 lib 目录下的所有 JAR 文件(如 gson-*.jar, log4j-*.jar 等)。
B. 永久设置(不推荐用于日常开发)
你可以通过设置环境变量 CLASSPATH 来永久指定一个默认的类路径。但通常不推荐这样做,因为它会干扰其他 Java 程序的运行,使得类路径变得不明确和难以管理。
设置方式(以 Windows 为例):
- 在“系统属性” -> “高级” -> “环境变量”中。
- 新建或编辑系统变量
CLASSPATH。 - 值设置为你的路径列表,
.;C:\my_libs。- 重要:开头的 表示当前目录,这是一个好习惯,因为很多默认的类加载器会从当前目录开始查找。
如何使用:
设置后,在任何地方运行 java 命令,JVM 都会自动加载 CLASSPATH 中指定的路径,你仍然可以在命令行中使用 -cp 来覆盖这个环境变量。
# 假设 CLASSPATH 环境变量已设置为 ".;C:\my_libs" # 运行时,JVM 会自动查找 当前目录 和 C:\my_libs java com.example.MainApp # 使用 -cp 会临时覆盖环境变量 java -cp "some_other_path" com.example.MainApp
现代 Java 开发与 Classpath
对于现代 Java 项目,我们几乎不再手动管理 classpath,我们使用构建工具(如 Maven 或 Gradle)来处理这一切。
- Maven / Gradle:这些工具会自动:
- 下载项目所需的所有依赖库到本地仓库(
.m2目录)。 - 编译源代码。
- 将所有依赖库和编译后的类打包成一个可执行的 JAR 文件(
my-app-1.0.jar)。 - 在这个最终的 JAR 文件的
MANIFEST.MF文件中,自动设置好正确的Class-Path属性或Main-Class。
- 下载项目所需的所有依赖库到本地仓库(
如何运行 Maven/Gradle 打包好的 JAR?
当你使用 mvn package 或 gradle build 后,你会得到一个包含所有依赖的 "fat JAR" 或 "uber JAR",你只需要用 java -jar 命令运行它即可,classpath 的问题已经完全由构建工具解决了。
# 假设 Maven 打包后生成了 target/my-app-1.0.jar java -jar target/my-app-1.0.jar
-jar 参数会告诉 JVM 从 JAR 文件的 MANIFEST.MF 中读取 Main-Class 和 Class-Path 信息,并设置好类路径。
| 特性 | 描述 |
|---|---|
| 作用 | 告诉 JVM 在哪里查找 .class 文件(项目代码和第三方库)。 |
| 设置方式 | 推荐:java -cp "路径列表" 主类名不推荐:设置 CLASSPATH 环境变量。 |
| 路径分隔符 | (Windows) vs (Linux/macOS) |
| 路径类型 | 目录、JAR/WAR 文件、通配符 |
| 现代实践 | 使用 Maven 或 Gradle 等构建工具,通过 java -jar your-app.jar 运行,无需手动管理 classpath。 |
掌握 java -cp 是理解 Java 运行机制的基础,但在实际工作中,把繁重的类路径管理工作交给构建工具,是更高效、更可靠的选择。
