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

相关推荐
一 乐17 小时前
动漫书销售商城|基于springboot + vue动漫书销售商城(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕业设计
卓怡学长18 小时前
w214基于jsp知道特产网
java·intellij-idea
步行cgn18 小时前
Spring 注解使用详解
java·spring
一条小小yu18 小时前
Spring IoC的理解
java·后端·spring
落魄实习生18 小时前
Agent Scope Java 2.x 系列【7】工具使用
java·开发语言·ai
旺仔学长 哈哈18 小时前
springboot钓鱼爱好者交流平台APP设计与实现
java·spring boot·mysql·充电桩管理系统
自强的小白20 小时前
核心功能(Service接口)
java·mybatis
乌暮21 小时前
深入理解 Java 泛型:把「万能盒子」用对、用稳
java·开发语言·后端·学习
大猫和小黄21 小时前
深入理解 Java Optional:从设计哲学到工程实战
java