java -jar与java -cp的区别

java -jar与java -cp

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

shell 复制代码
java -jar xxx.jar [args]
java -cp xxx.jar mainclass [args]

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

1、情景描述

1)Java打包单个类

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

bash 复制代码
javac Hello.java

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

bash 复制代码
java -cvf test.jar com

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

执行java -jar命令:

bash 复制代码
java -jar test.jar Tom
# test.jar中没有主清单属性

执行java -cp命令:

bash 复制代码
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运行时开始执行的类,其格式为:

bash 复制代码
Main-Class: com.test.Hello

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

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

bash 复制代码
java -cvfe test.jar com.test.Hello com

执行java -jar命令:

bash 复制代码
java -jar test.jar Tom
# Hello Tom
3、两者区别

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

bash 复制代码
Class-Path: xx01.jar xx02.jar org/xx03.jar

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

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

bash 复制代码
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

相关推荐
JH30734 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
Coder_Boy_5 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
invicinble6 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟6 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖6 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
qq_12498707537 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_7 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Mr_sun.7 小时前
Day06——权限认证-项目集成
java
瑶山7 小时前
Spring Cloud微服务搭建四、集成RocketMQ消息队列
java·spring cloud·微服务·rocketmq·dashboard
abluckyboy8 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法