Java常見(jiàn)啟動(dòng)命令-jar、-server和-cp詳細(xì)比較
Java程序常見(jiàn)啟動(dòng)方式
當(dāng)前java程序啟動(dòng)主要以 -jar
、-server
、-cp
等幾個(gè)命令啟動(dòng) jar
程序,其中我們最常用的java -jar
啟動(dòng)方式,通常我們需要將當(dāng)前工程所依賴的所有包編譯到一個(gè)jar包中,隨著工程不斷迭代,外部依賴越來(lái)越多,會(huì)導(dǎo)致整個(gè)jar包體積變得很大,每次更新部署傳輸效率就會(huì)變得很低,這時(shí)我們就可以使用到另外兩個(gè)命令來(lái)替代-jar
命令,將一部分或者全部依賴拆分,更新部署時(shí)只用更新部分依賴即可
java -jar
此命令不用多說(shuō),基本所有javaer都很熟悉,也很簡(jiǎn)單示例:基礎(chǔ)用法
java -jar xxxxxx.jar
依賴拆分到外部的用法,使用java -jar
命令,同時(shí)需要將部分依賴包拆分到主啟動(dòng)程序jar包外部時(shí),通常將jar包放置在主jar包相對(duì)目錄下的一個(gè)單獨(dú)的lib
文件中,如下圖,lib為拆分后的外部依賴放置的目錄
如上圖,原jar包大小為110m,通過(guò)將部分依賴移出到外部之后,主啟動(dòng)程序jar包僅5.4m,這樣便于開(kāi)發(fā)迭代時(shí)縮小傳輸體量,提高效率,這時(shí)需要使用到啟動(dòng)參數(shù)-Dloader.path=lib
來(lái)加載主程序外部的依賴
java -Dloader.path=lib -jar xxxxxx-app.jar
java -server與-client參數(shù)
可以通過(guò)-server或-client設(shè)置jvm的運(yùn)行參數(shù)。
它們的區(qū)別是Server VM的初始堆空間會(huì)大一些,默認(rèn)使用的是并行垃圾回收器,啟動(dòng)慢運(yùn)行快。Client VM相對(duì)來(lái)講會(huì)保守一些,初始堆空間會(huì)小一些,使用串行的垃圾回收器,它的目標(biāo)是為了讓JVM的啟動(dòng)速度更快,但運(yùn)行速度會(huì)比Serverm模式慢些。
JVM在啟動(dòng)的時(shí)候會(huì)根據(jù)硬件和操作系統(tǒng)自動(dòng)選擇使用Server還是Client類型的 JVM。
32位操作系統(tǒng)如果是Windows系統(tǒng),不論硬件配置如何,都默認(rèn)使用Client類型的JVM。
如果是其他操作系統(tǒng)上,機(jī)器配置有2GB以上的內(nèi)存同時(shí)有2個(gè)以上CPU的話默認(rèn)使用server模式,否則使用client模式。
64位操作系統(tǒng)只有server類型,不支持client類型。
-server
命令可以配合-jar
命令使用,也可單獨(dú)使用
java -server -Xmx1024m -Xms256m -Xmn512m -Xss256k -Dloader.path=lib -jar xxxxxx-app.jar
-server
單獨(dú)使用,配合-classpath
加載外部依賴
maven build構(gòu)建插件,maven-assembly-plugin
,將所有jar構(gòu)建到lib目錄
<build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.6</version> <configuration> <appendAssemblyId>true</appendAssemblyId> <finalName>cas-service</finalName> <descriptors> <descriptor>src/main/assembly/package.xml</descriptor> </descriptors> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
package.xml
<assembly xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd"> <id>bin</id> <formats> <format>tar.gz</format> </formats> <dependencySets> <dependencySet> <outputDirectory>lib</outputDirectory> <scope>runtime</scope> </dependencySet> </dependencySets> <fileSets> <fileSet> <directory>src/main/bin</directory> <outputDirectory>/bin</outputDirectory> <fileMode>755</fileMode> </fileSet> <fileSet> <directory>src/main/resources</directory> <excludes> <exclude>**/mybatis-mapper/*</exclude> </excludes> <outputDirectory>/conf</outputDirectory> </fileSet> </fileSets> </assembly>
#!/bin/bash MAIN_CLASS=com.xxx.XXXApp source ~/.bash_profile export PROJECT_HOME="$( cd "$(dirname "$0")"/.. pwd )" APP_CLASS_PATH=.:$PROJECT_HOME/conf:$PROJECT_HOME/lib/* mkdir $PROJECT_HOME/logs 2>/dev/null (LD_LIBRARY_PATH=. java -server -Xmx256m -Xms256m -Xmn128m -Xss512k \ -classpath $APP_CLASS_PATH $MAIN_CLASS >/dev/null 2>&1 &)
java -cp
使用-cp
命令啟動(dòng)時(shí),用法與-server
配合-classpath
使用時(shí)類似,不同的是不能與-jar
命令一起使用,使用-cp
命令時(shí)-jar
便會(huì)失效
#!/bin/bash MAIN_CLASS=com.xxx.XXXApp source ~/.bash_profile export PROJECT_HOME="$( cd "$(dirname "$0")"/.. pwd )" function init_app_class_path() { for file in $1/*; do if [ -z "$APP_CLASS_PATH" ]; then APP_CLASS_PATH=$file else APP_CLASS_PATH=$APP_CLASS_PATH:$file fi done } init_app_class_path $PROJECT_HOME/lib APP_CLASS_PATH=$PROJECT_HOME/conf:$APP_CLASS_PATH mkdir $PROJECT_HOME/logs 2>/dev/null (LD_LIBRARY_PATH=. java -Xmx512m -Xms256m -Xmn128m -Xss512k \ -cp $APP_CLASS_PATH $MAIN_CLASS >/dev/null 2>&1 &)
試了一下,-cp
掃描所有jar包及配置,直接使用*
也是可以匹配到的,如下這種方式也是有效的
java -cp /data/myapp/conf:/data/myapp/lib/* com.xxx.XXXApp
總結(jié)
到此這篇關(guān)于Java常見(jiàn)啟動(dòng)命令-jar、-server和-cp詳細(xì)比較的文章就介紹到這了,更多相關(guān)Java啟動(dòng)命令-jar、-server和-cp內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中有界隊(duì)列的飽和策略(reject policy)原理解析
這篇文章主要介紹了Java中有界隊(duì)列的飽和策略(reject policy)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04Jmeter使用接口傳遞數(shù)據(jù)過(guò)程圖解
這篇文章主要介紹了Jmeter使用接口傳遞數(shù)據(jù)過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05Spring Boot定時(shí)器創(chuàng)建及使用解析
這篇文章主要介紹了Spring Boot定時(shí)器創(chuàng)建及使用解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07淺談SpringMVC的攔截器(Interceptor)和Servlet 的過(guò)濾器(Filter)的區(qū)別與聯(lián)系 及Spr
這篇文章主要介紹了淺談SpringMVC的攔截器(Interceptor)和Servlet 的過(guò)濾器(Filter)的區(qū)別與聯(lián)系 及SpringMVC 的配置文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07