java -cp 用于命令行运行含外部依赖的 Java 程序,需统一指定主类路径和所有 JAR 路径:Windows 用分号;分隔,Linux/macOS 用冒号:分隔;支持 lib/* 通配符匹配目录下所有 JAR;必须包含主类所在目录、依赖 JAR 路径,路径含空格时须用英文双引号包裹。

使用 java -cp(或 java -classpath)可以在不借助构建工具(如 Maven、Gradle)的情况下,直接通过命令行运行含外部依赖的 Java 程序。关键在于把主程序的 class 文件路径和所有第三方 JAR 包路径**统一写进 classpath**,用分隔符连接。
classpath 路径拼接规则(平台相关)
Windows 和类 Unix 系统(Linux/macOS)的路径分隔符不同:
- Windows:用分号
;分隔多个路径,例如:java -cp "target/classes;lib/commons-lang3-3.12.0.jar;lib/gson-2.10.1.jar" com.example.Main - Linux/macOS:用冒号
:分隔,例如:java -cp "target/classes:lib/commons-lang3-3.12.0.jar:lib/gson-2.10.1.jar" com.example.Main
注意:路径中含空格时,整个 -cp 值必须用英文双引号包裹;推荐始终加引号,避免意外解析错误。
必须包含的三类路径
classpath 不是只写 JAR,而是要覆盖所有可执行代码来源:
-
主类所在目录:通常是编译输出目录(如
target/classes或bin),不是.java源文件位置 - 所有依赖 JAR 文件的绝对或相对路径:可以逐个列出,也可用通配符(见下一点)
-
当前目录(必要时):如果主类在默认包且 class 文件就在当前目录,需显式加上
.,例如:-cp ".;lib/a.jar"
巧用通配符 * 简化 JAR 列举(Java 6+ 支持)
当依赖较多时,不必一个个写 JAR 名字,可用 * 表示指定目录下**所有 JAR 文件**(不递归子目录):
- Windows:
java -cp "target/classes;lib/*" com.example.Main - Linux/macOS:
java -cp "target/classes:lib/*" com.example.Main
⚠️ 注意:* 只匹配 JAR 文件(.jar 后缀),不匹配 ZIP 或其他格式;它代表的是“该目录下所有 JAR”,不是“当前目录所有 JAR”;不能写成 lib/*.jar,这是 Shell 通配,JVM 不识别。
常见失败原因与检查建议
运行报 NoClassDefFoundError 或 ClassNotFoundException,大概率是 classpath 没配对:
- 确认 JAR 文件真实存在,路径大小写正确(尤其 macOS/Linux 区分大小写)
- 检查主类名是否完整(含包名),且该类确实存在于 classpath 指定的某个路径中
- 验证依赖 JAR 是否本身还有未满足的传递依赖(
*.jar不会自动拉取其依赖) - 用
jar -tf xxx.jar | head -5查看 JAR 内部结构,确认所需类路径(如com/google/gson/Gson.class)是否存在
不复杂但容易忽略细节,理清 classpath 是什么、谁需要被包含、怎么分隔,就能稳定运行。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











