java?-jar/-cp啟動(dòng)添加外部的依賴(lài)包方式
java -jar/-cp啟動(dòng)添加外部的依賴(lài)包
啟動(dòng)java主要有兩種方式,分別為:java -jar test.jar、java -cp/-classpath test.jar com.main.Test。
然后分別講一下這兩種方式啟動(dòng)程序時(shí),如何加載外部依賴(lài)的包。
為了方便大家理解,首先說(shuō)一下Java的ClassLoader。
ClassLoader的具體作用就是將class文件加載到j(luò)vm虛擬機(jī)中去。
我們都知道在Java中程序是運(yùn)行在虛擬機(jī)中,我們平常用文本編輯器或者是IDE編寫(xiě)的程序都是.java格式的文件,這是最基礎(chǔ)的源碼,但這類(lèi)文件是不能直接運(yùn)行的。
需要將.java的文件編譯成字節(jié)碼.class文件,才能加載到JVM中運(yùn)行,這個(gè)過(guò)程由ClassLoader來(lái)完成,Java自帶的ClassLoader有3大類(lèi),分別為:
Bootstrap ClassLoader 最頂層的加載類(lèi),主要加載核心類(lèi)庫(kù),%JRE_HOME%\lib下的rt.jar、resources.jar、charsets.jar和class等。
另外需要注意的是可以通過(guò)啟動(dòng)jvm時(shí)指定-Xbootclasspath和路徑來(lái)改變Bootstrap ClassLoader的加載目錄。
比如java -Xbootclasspath/a:path被指定的文件追加到默認(rèn)的bootstrap路徑中。
我們可以打開(kāi)我的電腦,在上面的目錄下查看,看看這些jar包是不是存在于這個(gè)目錄。
- Extention ClassLoader 擴(kuò)展的類(lèi)加載器,加載目錄%JRE_HOME%\lib\ext目錄下的jar包和class文件。還可以加載-D java.ext.dirs選項(xiàng)指定的目錄。
- Appclass Loader也稱(chēng)為SystemAppClass 加載當(dāng)前應(yīng)用的classpath的所有類(lèi)。
所以,我們要改變這加入外部依賴(lài)的jar包,可以分別考慮改變這3個(gè)ClassLoader來(lái)實(shí)現(xiàn),分別來(lái)講一下這3種實(shí)現(xiàn)方法。
一、Bootstrap ClassLoader通過(guò)改變Xbootclasspath參數(shù)實(shí)現(xiàn)
一般有3種方法:
- -Xbootclasspath: 完全取代基本核心的Java class 搜索路徑.不常用,否則要重新寫(xiě)所有Java 核心class
- -Xbootclasspath/a: 后綴在核心class搜索路徑后面(推薦使用)
- -Xbootclasspath/p: 前綴在核心class搜索路徑前面.不常用,避免引起不必要的沖突.
使用Bootstrap ClassLoader的一般方式為:
java -Xbootclasspath/a:test1.jar -jar test2.jar //-jar方式 java -Xbootclasspath/a:test1.jar -cp test2.jar com.test2.Test2 //-cp方式
二、Extention ClassLoader通過(guò)改變參數(shù)java.ext.dirs實(shí)現(xiàn)
java中系統(tǒng)屬性java.ext.dirs指定的目錄由ExtClassLoader加載器加載,如果您的程序沒(méi)有指定該系統(tǒng)屬性(-Djava.ext.dirs=lib)那么該加載器默認(rèn)加載 $JAVA_HOME/lib/ext目錄下的所有jar文件。
但如果你手動(dòng)指定系統(tǒng)屬性且忘了把$JAVA_HOME/lib/ext路徑給加上,那么ExtClassLoader不會(huì)去加載$JAVA_HOME/lib/ext下面的jar文件,這意味著你將失去一些功能,例如java自帶的加解密算法實(shí)現(xiàn)。
所以我們要既要帶有原來(lái)的lib/ext下的包,也要加入其他依賴(lài),則可以這樣寫(xiě)
java -Djava.ext.dirs=%JAVA_HOME%\jre\lib\ext;lib -jar test2.jar java -Djava.ext.dirs=%JAVA_HOME%\jre\lib\ext;lib -cp test2.jar com.test2.Test2 #java.ext.dirs需要寫(xiě)成目錄格式
三、Appclass Loader加載的是classpath配置的jar包
java -cp和java -jar命令啟動(dòng)程序的時(shí)候,有一些不同,主要為:
用java -jar啟動(dòng)的時(shí)候,java VM會(huì)屏蔽所有的外部classpath,也就是配置的 -cp/-classpath環(huán)境變量會(huì)失效,而只以本身jar的內(nèi)部class作為類(lèi)的尋找范圍。
這時(shí)候只能通過(guò)改變META-INF/MANIFEST.MF來(lái)設(shè)置classpath,而java -cp方式則可以正常加載內(nèi)部的類(lèi)來(lái)實(shí)現(xiàn)。
所以這兩種方式加載外部類(lèi)的方法分別為:
3.1 java -cp/classpath方式
java -cp test2.jar;test1.jar com.test2.Test2 #Test是main方法,通過(guò)-cp方式加載2個(gè)jar包
3.2 java -cp方式
修改主類(lèi)jar包 META-INF/MANIFEST.MF內(nèi)容種的
Main-Class屬性,例如
Main-Class: /home/test1.jar /home/test3.jar
#多個(gè)jar包用空格隔開(kāi)
我的做法是:
直接修改java.ext.dirs來(lái)加載jar包的屬性來(lái)實(shí)現(xiàn)
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
RocketMQ源碼分析之Broker過(guò)期消息清理機(jī)制
這篇文章主要為大家介紹了RocketMQ源碼分析之Broker過(guò)期消息清理機(jī)制示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05Java通過(guò)PowerMockito和Mokito進(jìn)行單元測(cè)試的實(shí)現(xiàn)
PowerMockito和Mockito都是Java語(yǔ)言中的測(cè)試框架,用于進(jìn)行單元測(cè)試和集成測(cè)試,本文就來(lái)詳細(xì)的介紹一下通過(guò)PowerMockito和Mokito進(jìn)行單元測(cè)試,感興趣的可以了解一下2023-08-08java實(shí)現(xiàn)mongodb的數(shù)據(jù)庫(kù)連接池
這篇文章主要介紹了基于java實(shí)現(xiàn)mongodb的數(shù)據(jù)庫(kù)連接池,Java通過(guò)使用mongo-2.7.3.jar包實(shí)現(xiàn)mongodb連接池,感興趣的小伙伴們可以參考一下2015-12-12Javafx利用fxml變換場(chǎng)景的實(shí)現(xiàn)示例
本文主要介紹了Javafx利用fxml變換場(chǎng)景的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07mybatis-plus中更新null值的問(wèn)題解決
本文主要介紹 mybatis-plus 中常使用的 update 相關(guān)方法的區(qū)別,以及更新 null 的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-04-04springcloud本地調(diào)試feign調(diào)用出現(xiàn)的詭異404問(wèn)題及解決
這篇文章主要介紹了springcloud本地調(diào)試feign調(diào)用出現(xiàn)的詭異404問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Java整數(shù)和字符串相互轉(zhuǎn)化實(shí)例詳解
這篇文章主要介紹了Java整數(shù)和字符串相互轉(zhuǎn)化實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02