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

相关推荐
长安——归故李7 小时前
【modbus学习】
java·c语言·c++·学习·算法·c#
许苑向上7 小时前
Spring Boot 的注解是如何生效的
java·spring boot·后端
爱读源码的大都督7 小时前
挑战一下,用Java手写Transformer,先手写QKV,能成功吗?
java·后端·程序员
华仔啊7 小时前
面试官灵魂拷问:count(1)、count(*)、count(列)到底差在哪?MySQL 性能翻车现场
java·后端
用户0332126663678 小时前
在Word 中插入页眉页脚:实用 Java 指南
java
奔跑吧邓邓子8 小时前
【Java实战㊱】Spring Boot邂逅Redis:缓存加速的奇妙之旅
java·spring boot·redis·缓存·实战
杨杨杨大侠8 小时前
Atlas-Event:高性能事件处理与监控系统
java·github·eventbus
杨杨杨大侠8 小时前
Atlas Event:解锁事件驱动的潜能
java·github·eventbus
失散138 小时前
分布式专题——4 大厂生产级Redis高并发分布式锁实战
java·redis·分布式·缓存·架构
MacroZheng8 小时前
堪称一站式管理平台,同时支持Linux、MySQL、Redis、MongoDB可视化管理!
java·linux·后端