java -jar与java -cp的区别

发布于:2025-04-16 ⋅ 阅读:(21) ⋅ 点赞:(0)





通常情况下,我们会看到以下两种命令启动的Java程序:

java -jar xxx.jar [args]
java -cp xxx.jar mainclass [args]

这两种用法有什么区别呢?

1、情景描述

1)Java打包单个类

例如,在com.test下有一个文件Hello.java,在test目录CMD命令行下执行编译:

javac Hello.java

com上层目录CMD命令行执行单个类打jar包命令:

java -cvf test.jar com

2)分别执行java -jar和java -cp

执行java -jar命令:

java -jar test.jar Tom
# test.jar中没有主清单属性

执行java -cp命令:

java -cp test.jar com.test.Hello Tom
# Hello Tom

也就是java -jar命令执行报错,java -cp命令执行成功。这是什么原因呢?

2、情景分析

首先jar包实际上和zip压缩文件是一样的,我们甚至完全可以用zip压缩工具来压缩com目录,然后用java -cp com.zip com.test.Hello Tom运行。不同的是,使用java命令打出的jar包会多出来一个东西:META-INF目录

该目录里面有一个MANIFEST.MF文件,这个文件就是jar的主清单文件。java -jar提示“没有主清单属性”,就是因为主清单文件中缺失了一个属性:Main-Class,它声明了jar包的默认入口类,也就是java -jar运行时开始执行的类,其格式为:

Main-Class: com.test.Hello

如果我们在MANIFEST.MF文件中添加上述属性,java -jar将执行成功。需要注意的是,该属性冒号后面有一个空格,且属性结束必须换行

当然,在打jar包时可以通过-e参数指定默认入口类(自动生成Main-Class属性),在com上层目录CMD命令行执行单个类打jar包命令:

java -cvfe test.jar com.test.Hello com

执行java -jar命令:

java -jar test.jar Tom
# Hello Tom
3、两者区别

使用java -jar运行jar包时,虚拟机将忽略系统中的classpath配置,如果有依赖jar,需要在主清单属性中指定,格式为:

Class-Path: xx01.jar xx02.jar org/xx03.jar

多个jar包之间使用空格隔开,其路径是相对于当前运行jar包所在的目录

使用java -cp运行jar包时,cp本身就是classpath的意思,依赖多个jar时,直接在命令中指定,格式为:

java -cp test.jar;xx01.jar;xx02.jar com.test.Hello

值得注意的是,多个jar包之间的分隔符在Windows上是;,而在Linux中是:

综上所述,java -jar命令与java -cp命令的区别总结如下:

  • java -jar:用来执行可执行jar,其可执行性由jar包中的主清单属性Main-Class决定

  • java -cp:纯粹的java命令,在指定classpath下查找Java类文件并执行,使用更灵活



参考文章:https://blog.csdn.net/firstendhappy/article/details/119209167



网站公告

今日签到

点亮在社区的每一天
去签到