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