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