这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战
前言
在Linux中执行Java程序的时候,需要使用java -jar或者java -cp来指定要运行的jar,两种方式的运行机制的不一样的,今天就来盘点一下这两种运行方法的区别。
执行程序
假如我们有一个程序,这里把它打包成Test.jar,如何运行才能成功输出Hello World。
代码如下:
1 | java复制代码package com.test; |
我们常见的有以下两种方法运行:
1 | java复制代码1. java -jar 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中再上传一遍,节约了时间。
本文转载自: 掘金