java -jar和-cp的区别

这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

前言

在Linux中执行Java程序的时候,需要使用java -jar或者java -cp来指定要运行的jar,两种方式的运行机制的不一样的,今天就来盘点一下这两种运行方法的区别。

执行程序

假如我们有一个程序,这里把它打包成Test.jar,如何运行才能成功输出Hello World。

代码如下:

1
2
3
4
5
6
java复制代码package com.test;
public class Test {
public static void main(String[] args) {
System.out.println("Hello World");
}
}

我们常见的有以下两种方法运行:

1
2
java复制代码1. java -jar Test.jar
2. java -cp com.test.Test Test.jar

这里就先分析一下-jar运行方式的机制。

java -jar

我们解压jar包,里面的META-INF文件夹下都有MANIFEST.MF

内容如图:


我们知道想要运行一个Java程序,必须要有一个main()方法作为入口,这样才能启动程序。

而java -jar是通过Main-Class来找到Test类并执行其中的main(),输出Hello World!如果你的MANIFEST.MF文件中没有Main-Class,就会提示Cant load main-class的错误。所以在导出jar包或者使用maven打包插件的的时候一定要指定main-class。

如图:

这样导出的时候,MF文件中就会有了入口类的信息。

java -cp

对于java -cp就不需要指定Main-Class来指定入口。因为在启动时,第一个参数就指定了你的入口类,第二个参数就是你的jar包。它会根据你的jar包找到第一个参数指定的Test类,来输出HelloWorld。

区别

假设我们这个程序的运行,需要依赖一个叫Dep.jar的包。

如果我们使用-jar的话,需要把Dep.jar一同打包到Test.jar中,因为-jar只能指定一个jar包.

如果是使用-cp,我们可以选择将Dep.jar放到Test.jar中,也可以选择使用以下命令来运行:

1
bash复制代码java -cp com.test.Test Test.jar:Dep.jar

cp其实就是classpath,在linux中多个jar包用 : 分割,代表了程序运行需要的所有jar包。

这样就可以不用将所有依赖都一起打包到Test.jar下。这样做的好处就是,假如修改了Test类,只上传修改后的Test.jar到服务器即可,不需要再将所有依赖再打包到Test.jar中再上传一遍,节约了时间。

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%