什么是 CLASSPATH?
CLASSPATH 是一个操作系统环境变量,它的作用是告诉 Java 虚拟机 在哪里寻找用户自定义的类(.class 文件)和 Java 归档文件(.jar 文件)。

当你的 Java 代码中引用了一个类(import com.example.MyTool;),JVM 就会按照以下顺序去寻找这个类的定义:
- Bootstrap Classpath (启动类路径):这是 JVM 核心类(来自
jre/lib/rt.jar等文件)的路径,这是最高优先级,不可修改。 - Extension Classpath (扩展类路径):JVM 扩展类的路径(来自
jre/lib/ext/目录),优先级次之。 - User Classpath (用户类路径):这就是
CLASSPATH环境变量所指定的路径,JVM 会在这里查找你编写的类以及第三方库。
一个常见的误解是: CLASSPATH 是必须设置的。从 Java 6 开始,CLASSPATH 环境变量已经被弃用,现代 Java 开发强烈推荐使用更简单、更强大的构建工具(如 Maven, Gradle)来管理依赖和类路径。
CLASSPATH 的基本规则
CLASSPATH 的值可以包含:
- 目录路径:指向包含
.class文件的根目录。 - JAR 文件路径:指向一个
.jar文件。 - *通配符 `
**:表示匹配该目录下的所有.jar` 文件。 - 路径分隔符:
- 在 Windows 系统上是分号
- 在 Linux / macOS 系统上是冒号
查找规则:

CLASSPATH指向一个目录,JVM 会在这个目录及其子目录中查找.class文件。CLASSPATH指向一个JAR 文件,JVM 会在该 JAR 文件的所有目录结构中查找.class文件。CLASSPATH中可以包含多个路径,用路径分隔符隔开,JVM 会按顺序依次查找。
如何设置 CLASSPATH
编译和运行单个 .java 文件
假设我们有以下项目结构:
my_project/
├── src/
│ └── com/
│ └── example/
│ └── HelloWorld.java
└── lib/
└── gson-2.10.1.jar (一个第三方 JSON 库)
HelloWorld.java:
package com.example;
// 导入 Gson 库
import com.google.gson.Gson;
public class HelloWorld {
public static void main(String[] args) {
Gson gson = new Gson();
String json = gson.toJson(new MyObject("Java", 123));
System.out.println(json);
}
}
class MyObject {
private String name;
private int value;
// ... constructor and getters
public MyObject(String name, int value) {
this.name = name;
this.value = value;
}
}
步骤 1:编译
我们需要将 src 目录和 lib 目录下的 JAR 文件都加入到编译的类路径中。

-
Windows (CMD):
# 注意路径分隔符是 ; set CLASSPATH=.;%CLASSPATH%;src;lib\gson-2.10.1.jar javac -cp ".;src;lib\gson-2.10.1.jar" src\com\example\HelloWorld.java
- 代表当前目录。
-cp(或-classpath) 是编译时临时指定类路径的参数,它会覆盖环境变量中的CLASSPATH,这是更推荐的做法。
-
Linux / macOS:
# 注意路径分隔符是 : export CLASSPATH=.:${CLASSPATH}:src:lib/gson-2.10.1.jar javac -cp ".:src:lib/gson-2.10.1.jar" src/com/example/HelloWorld.java
编译后,.class 文件会生成在 src/com/example/ 目录下。
步骤 2:运行
运行时同样需要提供正确的类路径。
-
Windows (CMD):
java -cp ".;src;lib\gson-2.10.1.jar" com.example.HelloWorld
-
Linux / macOS:
java -cp ".:src:lib/gson-2.10.1.jar" com.example.HelloWorld
使用通配符
lib 目录下有很多 JAR 文件,手动列出会很麻烦,可以使用 通配符。
-
Windows (CMD):
java -cp ".;src;lib\*" com.example.HelloWorld
这会自动包含
lib目录下所有的.jar文件。 -
Linux / macOS:
java -cp ".:src:lib/*" com.example.HelloWorld
注意: 通配符 不会递归查找子目录中的 JAR 文件。
永久设置 CLASSPATH 环境变量
不推荐!因为现代项目通常依赖构建工具,但如果某些特殊场景需要,可以按以下步骤操作。
Windows:
- 右键“此电脑” -> “属性” -> “高级系统设置”。
- 点击“环境变量...”按钮。
- 在“系统变量”区域,点击“新建...”。
- 变量名:
CLASSPATH - 变量值:
.;C:\path\to\your\libs\*.jar( - 确定所有窗口。
Linux / macOS:
打开并编辑 ~/.bashrc 或 ~/.zshrc 文件 (取决于你使用的 Shell)。
# 使用 vim 编辑器打开文件 vim ~/.bashrc
在文件末尾添加以下行:
# Linux export CLASSPATH=.:$CLASSPATH:/path/to/your/libs/*.jar # macOS (语法相同) export CLASSPATH=.:$CLASSPATH:/path/to/your/libs/*.jar
保存文件后,运行以下命令使配置生效:
source ~/.bashrc # 或者 source ~/.zshrc
现代 Java 开发的最佳实践:为什么应该避免手动设置 CLASSPATH?
手动管理 CLASSPATH 是一件痛苦且容易出错的事情,原因如下:
- 依赖地狱:项目依赖 A,A 依赖 B,B 依赖 C,手动管理这些传递性依赖几乎是不可能的。
- 版本冲突:不同的库可能依赖同一个库的不同版本,导致
ClassNotFoundException或NoSuchMethodError。 - 项目移植性差:每台开发机器、服务器都需要配置相同的
CLASSPATH,非常麻烦。 - 构建过程复杂:每次编译、运行都需要手动输入一长串的
-cp参数。
解决方案:使用构建工具
现代 Java 项目几乎都使用 Maven 或 Gradle 这样的构建工具。
- Maven: 使用
pom.xml文件声明项目依赖,Maven 会自动下载所有依赖的 JAR 文件到本地仓库(.m2/repository),并在编译和运行时自动构建正确的类路径。 - Gradle: 使用
build.gradle或build.gradle.kts文件声明依赖,Gradle 同样会自动管理依赖和类路径。
使用 Maven 运行上面的例子:
-
在项目根目录创建
pom.xml文件,并添加 Gson 依赖。<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>hello-world</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> <dependencies> <!-- Google Gson --> <dependency>
