柚子快報(bào)激活碼778899分享:java Maven相關(guān)知識(shí)
柚子快報(bào)激活碼778899分享:java Maven相關(guān)知識(shí)
maven 繼承與聚合
聚合:聚合多個(gè)模塊(可以一起構(gòu)建) ,各模塊之間單獨(dú)打包 繼承: 為了消除重復(fù),將相同的配置提取,子模塊默認(rèn)繼承全部父模塊的依賴dependencies節(jié)點(diǎn),通過它來管理jar包的版本,讓子項(xiàng)目中引用一個(gè)依賴而不用顯示的列出版本號(hào)
聚合只需要在 父模塊 中指定module既可以
繼承除了要在父模塊中指定modules外,還需要在子模塊中指定parent
Maven中dependencies節(jié)點(diǎn)和dependencyManagement節(jié)點(diǎn)的區(qū)別
一個(gè)是項(xiàng)目依賴,一個(gè)是多模塊maven項(xiàng)目時(shí)候的依賴管理控制的. dependencyManagement一般存在在頂層pom文件中 dependencies即使在子項(xiàng)目中不寫該依賴項(xiàng),那么子項(xiàng)目仍然會(huì)從父項(xiàng)目中繼承該依賴項(xiàng)(全部繼承)
dependencyManagement里只是聲明依賴,并不實(shí)現(xiàn)引入,因此子項(xiàng)目需要顯示的聲明需要用的依賴。如果不在子項(xiàng)目中聲明依賴,是不會(huì)從父項(xiàng)目中繼承下來的;只有在子項(xiàng)目中寫了該依賴項(xiàng),并且沒有指定具體版本,才會(huì)從父項(xiàng)目中繼承該項(xiàng),并且version和scope都讀取自父pom;另外如果子項(xiàng)目中指定了版本號(hào),那么會(huì)使用子項(xiàng)目中指定的jar版本。
dependencyManagement的好處是子模塊可以有選擇行的繼承,而不需要全部繼承。 注意:dependencyManagement只是進(jìn)行版本的管理,可以讓子模塊有選擇的進(jìn)行依賴
dependency元素
dependency中除了可以指定依賴項(xiàng)目的groupId、artifactId和version之外,還可以指定以下元素:
type:對(duì)應(yīng)于依賴項(xiàng)目的packaging類型,默認(rèn)是jar scope:表示依賴項(xiàng)目的一個(gè)作用范圍。scope的主要取值范圍如下(還有一個(gè)是在Maven2.0.9以后版本才支持的import,關(guān)于import作用域?qū)⒃诤笪摹禗ependency介紹》中做介紹):
compile:這是它的默認(rèn)值,這種類型很容易讓人產(chǎn)生誤解,以為只有在編譯的時(shí)候才是需要的,其實(shí)這種類型表示所有的情況都是有用的,包括編譯和運(yùn)行時(shí)。而且這種類型的依賴性是可以傳遞的。 provided:這個(gè)跟compile很類似,但是它表示你期望這個(gè)依賴項(xiàng)目在運(yùn)行時(shí)由JDK或者容器來提供。這種類型表示該依賴只有在測(cè)試和編譯的情況下才有效,在運(yùn)行時(shí)將由JDK或者容器提供。這種類型的依賴性是不可傳遞的。 runtime:這種類型表示該依賴在編譯的時(shí)候不是必須的,只有在運(yùn)行的時(shí)候才是必須的。 test:這表示這種依賴只有測(cè)試的時(shí)候才需要,正常情況下是不需要的。 system:這種類型跟provided類似,唯一不同的就是這種類型的依賴我們要自己提供jar包,這需要與另一個(gè)元素systemPath來結(jié)合使用。systemPath將指向我們系統(tǒng)上的jar包的路徑,而且必須是給定的絕對(duì)路徑。 systemPath:上面已經(jīng)說過了這個(gè)元素是在scope的值為system的時(shí)候用于指定依賴的jar包在系統(tǒng)上的位置的,而且是絕對(duì)路徑。該元素必須在依賴的 jar包的scope為system時(shí)才能使用,否則Maven將報(bào)錯(cuò)。 optional:當(dāng)該項(xiàng)目本身作為其他項(xiàng)目的一個(gè)依賴時(shí)標(biāo)記該依賴為可選項(xiàng)。假設(shè)現(xiàn)在projectA有一個(gè)依賴性projectB,我們把projectB這個(gè)依賴項(xiàng)設(shè)為optional,這表示projectB在projectA的運(yùn)行時(shí)不一定會(huì)用到。這個(gè)時(shí)候如果我們有另一個(gè)項(xiàng)目projectC,它依賴于projectA,那么這個(gè)時(shí)候因?yàn)閜rojectB對(duì)于projectA是可選的,所以Maven在建立projectC的時(shí)候就不會(huì)安裝projectB,這個(gè)時(shí)候如果projectC確實(shí)需要使用到projectB,那么它就可以定義自己對(duì)projectB的依賴。當(dāng)一個(gè)依賴是可選的時(shí)候,我們把optional元素的值設(shè)為true,否則就不設(shè)置optional元素。 exclusions:考慮這樣一種情況,我們的projectA依賴于projectB,然后projectB又依賴于projectC,但是在projectA里面我們不需要projectB依賴的projectC,那么這個(gè)時(shí)候我們就可以在依賴projectB的時(shí)候使用exclusions元素下面的exclusion排除projectC。
maven 打包
當(dāng)項(xiàng)目要上線,部署到服務(wù)器上去的時(shí)候或許會(huì)碰見這樣的問題。問題就是,服務(wù)器上沒有maven的環(huán)境,也就是說,項(xiàng)目所依賴到的那些倉(cāng)庫(kù)(repository)中的jar包你需要單獨(dú)提取出來上傳到服務(wù)器中去。
maven 在進(jìn)行打包(mvn package)時(shí),會(huì)根據(jù)< packaging >來判斷是打成何種包: war包:能自動(dòng)將項(xiàng)目依賴的jar包打到web-inf下的lib文件夾中。 jar包:執(zhí)行過程中不會(huì)將依賴的第三方包提取出來。
maven assembly插件
maven在打包的時(shí)候,如果是對(duì)jar包進(jìn)行打包,是不會(huì)將依賴的第三方包提取出來,發(fā)布項(xiàng)目只發(fā)布這個(gè)打包好的jar包,會(huì)提示找不到第三方依賴包中類的定義。之前看到有人在項(xiàng)目要上線的時(shí)候?qū)om類型改成war,然后執(zhí)行一下mvn package命令,這樣先把所以依賴到的包提取出來,然后再把pom類型改成jar,這樣雖然能完成任務(wù),但是,總感覺這樣的做法比較拙劣。 其實(shí),完全可以通過使用maven自帶的assembly插件來完成 先打war包,然后再改為jar的過程。
1.在pom文件中指定assembly插件
2.開發(fā)assembly.xml文件
unpack元素指定為true,則會(huì)將所有的代碼打包到指定的jar包中
注意這會(huì)將所有的包都unpack到目標(biāo)jar包里(即該jar包包含所有的代碼)
unpack元素指定為false,則會(huì)對(duì)各個(gè)第三方依賴分別打到j(luò)ar包中
柚子快報(bào)激活碼778899分享:java Maven相關(guān)知識(shí)
好文鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。