无需Gradle/Maven,如何通过CMD传递JAR依赖运行Java程序?
命令行运行带JAR依赖的Java程序解决方案
项目结构前提
假设你的项目目录结构如下(确保依赖JAR都存放在lib目录,源码文件在src目录):
项目根目录/ ├── lib/ │ ├── gson-2.10.jar │ ├── okhttp-3.4.1.jar │ ├── okio-3.2.0.jar │ ├── slf4j-api-2.0.6.jar └── src/ └── Main.java # 主类必须包含public static void main(String[] args)方法
一、编译代码(兼容所有Java版本)
你的命令错误原因
你之前使用javac -classpath lib/*.jar -sourcepath src/*报错,核心问题:
- 类Unix系统(Linux/macOS)的Shell会自动将
lib/*.jar展开为多个独立文件名,javac会把这些文件名识别为无效编译参数,触发invalid flag错误。 - Java的classpath通配符语法是
lib/*(代表lib目录下所有JAR文件),而非lib/*.jar。
正确编译命令
类Unix系统(Linux/macOS)
先进入项目根目录,执行以下命令:
javac -cp "lib/*" -d bin src/*.java
-cp "lib/*":用引号包裹通配符,避免Shell自动展开,让javac自行解析所有依赖JAR。-d bin:指定编译后的class文件输出到bin目录(目录不存在时javac会自动创建)。- 如果主类在子包(如
src/com/example/Main.java),命令调整为:
javac -cp "lib/*" -d bin src/com/example/Main.java
Windows系统(CMD)
javac -cp lib\* -d bin src\*.java
Windows CMD不会自动展开通配符,javac会直接解析lib\*。
二、运行程序
你的命令错误原因
java -cp lib/* -sourcepath src/*报错:Shell展开lib/*为多个JAR文件名,java命令误将第一个JAR当作主类名,导致找不到主类;且-sourcepath是javac专属参数,java命令不需要。java -cp ... src/Main.java报错:若直接运行源码(仅Java 11+支持),需确保类路径包含依赖,同时主类的包结构与文件路径完全匹配。
正确运行命令
方式1:运行编译后的class文件(推荐,兼容所有Java版本)
假设主类无包结构,编译后的class文件在bin目录:
- 类Unix系统:
java -cp "bin:lib/*" Main
- Windows系统(用
;作为类路径分隔符):
java -cp "bin;lib\*" Main
如果主类有包(如com.example.Main),命令调整为:
java -cp "bin:lib/*" com.example.Main
方式2:Java 11+直接运行源码文件
- 类Unix系统:
java -cp "lib/*" src/Main.java
- 若主类在子包,进入项目根目录后运行:
java -cp "lib/*" src/com/example/Main.java
三、关键注意事项
- 类路径分隔符:类Unix系统用
:,Windows系统用;,不要混淆。 - 通配符必须写
lib/*,不能写成lib/*.jar,否则会触发Shell自动展开导致错误。 - 务必确保主类包含
public static void main(String[] args)入口方法。 - 编译时一定要用
-d指定输出目录,避免class文件与源码混杂引发运行问题。
内容的提问来源于stack exchange,提问作者JAMSHAID
相关产品推荐
相关产品推荐

