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

相关推荐
一只小闪闪11 分钟前
langchain4j搭建失物招领系统(六)---实现失物查询功能-RAG使用
java·人工智能·后端
雷渊19 分钟前
RocketMQ生产者的消息被消费后会永久放在磁盘里吗?
java·后端·面试
2401_8906661326 分钟前
免费送源码:Java+ssm+MySQL 校园二手书销售平台设计与实现 计算机毕业设计原创定制
java·spring boot·python·mysql·小程序·php·课程设计
言小乔.35 分钟前
202527 | RabbitMQ-基础 | 队列 | Direct + Fanout + Topic 交换机 | 消息转换器
java·微服务·消息队列·rabbitmq·mq·消息中间件
SoFlu软件机器人1 小时前
高并发场景下的 Java 性能优化
java·开发语言·性能优化
今天不学习明天变拉吉1 小时前
分页查询列表每页1000条的优化
java·数据库·mysql·性能优化
green5+11 小时前
卡码网55:右旋字符串
java·开发语言
huangsu_1231 小时前
java+postgresql+swagger-单表批量和循环insert、delete操作(八)
java·开发语言·数据库·postgresql
Java技术小馆2 小时前
如何处理消息堆积
java·面试·架构
zzzzz3692 小时前
SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”的解决方案
java·后端