Maven詳解
1.1 目標(biāo)
- maven是什么?
- maven能干什么?
- maven是如何工作的?
- maven中你遇到過什么問題,是通過什么方法,手段定位的問題,然后如何解決的?
1.2 Maven概括
-
maven簡介
-
Maven 是一個項目管理和綜合工具。Maven 提供了開發(fā)人員構(gòu)建一個完整的生命周期框架。開發(fā)團(tuán)隊可以自動完成項目的基礎(chǔ)工具建設(shè),Maven 使用標(biāo)準(zhǔn)的目錄結(jié)構(gòu)和默認(rèn)構(gòu)建生命周期。
-
在多個開發(fā)團(tuán)隊環(huán)境時,Maven 可以設(shè)置按標(biāo)準(zhǔn)在非常短的時間里完成配置工作。由于大部分項目的設(shè)置都很簡單,并且可重復(fù)使用,Maven 讓開發(fā)人員的工作更輕松,同時創(chuàng)建報表,檢查,構(gòu)建和測試自動化設(shè)置。
-
概括地說,Maven 簡化和標(biāo)準(zhǔn)化項目建設(shè)過程。處理編譯,分配,文檔,團(tuán)隊協(xié)作和其他任務(wù)的無縫連接。 Maven 增加可重用性并負(fù)責(zé)建立相關(guān)的任務(wù)。有了maven你的工作就簡單了.
-
下載安裝(略)
idea自帶一套maven的環(huán)境.使用idea開發(fā),無需安裝windows的maven. 但是有的開發(fā)者,喜歡單獨(dú)使用maven,windows單獨(dú)安裝了一套.
1.3 多模塊開發(fā)
1.3.1 pom.xml
- 每一個maven項目都有一個pom文件.Project Object Model 項目對象模型,maven作為一個項目開發(fā)管理工具,將每一個項目看成是一個對象.pom文件是描述這個對象的數(shù)據(jù)文件**(元數(shù)據(jù))**.通過pom文件的內(nèi)容,maven軟件就可以管理控制項目.
1.3.2 生命周期
maven管理項目時,總是先加載pom然后執(zhí)行聲明周期的命令邏輯,maven項目從創(chuàng)建開始,要經(jīng)歷如下幾個生命周期環(huán)節(jié).
概念: 生命周期,對象目標(biāo)經(jīng)歷的環(huán)節(jié),經(jīng)歷的步驟.
-
validate:
底層執(zhí)行的maven命令 實際上 .校驗一下 當(dāng)前沒問結(jié)構(gòu),環(huán)境是否符合maven項目開發(fā)要求.
idea中幾乎不會用到.mvn validate
-
compile:
maven項目的編譯,只負(fù)責(zé)main中相關(guān)內(nèi)容的編譯輸出,默認(rèn)輸出到 target/classesmvn compile
-
test
執(zhí)行項目的單元測試. 會生成單元測試報告,包含前一步的compile,并且將測試代碼編譯輸出mvn test
-
package
將項目打包
注意: 根據(jù)packaging類型不一樣,打包的輸出結(jié)果就不同.類型有三種常用的
jar/war/pom.第三種類型沒有代碼,只能作為父工程或者聚合工程使用mvn package
-
install
將項目打包,安裝存放到本地庫(遠(yuǎn)程庫,本地庫.目前的遠(yuǎn)程庫 central中央庫)mvn install
-
site
根據(jù)Maven配置生成一個html頁面集.針對這個項目做的可觀測頁面.mvn sit
-
deploy
和私服有關(guān).公司開發(fā),傳遞jar包的方式mvn deploy
Idea自定義運(yùn)行命令
執(zhí)行自定義maven命令,添加一個選項-X可以在控制臺打印maven執(zhí)行命令的詳細(xì)日志.
目的是在出錯的時候,幫助我們提供更準(zhǔn)確的定位信息.
提問: 所有maven項目的生命周期經(jīng)歷的環(huán)節(jié)都完全一樣么?
例如:
項目運(yùn)行的web應(yīng)用: compile test package install deploy(不需要)
項目是提供給同事復(fù)用的代碼: compile test pakcage install deploy
1.3.3 依賴特性(多模塊1)
依賴
- 作用是什么: 代碼項目的復(fù)用
- 如何使用: dependency標(biāo)簽
- 特性是什么: 依賴有傳遞性
- idea中想要觀察依賴的傳遞性: 傳遞性是強(qiáng)制傳遞,maven允許提出不需要的傳遞
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.22.RELEASE</version>
<!--去除當(dāng)前依賴,默認(rèn)傳遞過來的其他依賴資源-->
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
1.3.4 繼承特性(多模塊2)
- 在同一個項目中不同模塊的開發(fā)者中,各自維護(hù)自己的項目依賴關(guān)系,有可能出現(xiàn)圖中的情況,相互關(guān)聯(lián)的兩個模塊同時依賴A.jar,但是版本不同,會導(dǎo)致嚴(yán)重的結(jié)果,相互之間的關(guān)系存在兼容問題. 為了保證沒有兼容問題.
- 繼承意義
為了統(tǒng)一多模塊協(xié)作多人開發(fā)版本資源,maven提供了一個多模塊特性–繼承
繼承的實現(xiàn) - 確定父子關(guān)系**(文件夾結(jié)構(gòu)就是父子關(guān)系)**
- 父工程packaging標(biāo)簽值必須是pom,子工程使用parent標(biāo)簽指向父工程(idea自動幫你實現(xiàn)了)
區(qū)分開類的繼承,和maven的繼承細(xì)節(jié).區(qū)分開依賴和繼承的區(qū)別
細(xì)節(jié): parent標(biāo)簽詳解
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.13</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
relativePath: 子工程尋找父工程pom文件的相對路徑地址.如果子工程無法找到父工程的pom,無法實現(xiàn)繼承.這個值有三種配置方式
- 默認(rèn)值(不給標(biāo)簽) …/pom.xml
- 自定義值,根據(jù)你的pom位置,合理的編寫路徑信息(夸文件夾級別繼承)
- 空值 只在本地庫找父工程的pom文件,如果本地庫沒有,從遠(yuǎn)程庫下載
-
本地庫資源路徑(必須掌握通過maven標(biāo)簽找到庫資源)
- 找本地庫在哪c:/{User}/.m2/repository/org/springframework/boot/spring-boot-starter-parent/2.7.13
-
繼承的本質(zhì)
子工程繼承父工程, pom文件的繼承,繼承之后,獲取的內(nèi)容就是pom文件中的標(biāo)簽.
pom文件中標(biāo)簽的復(fù)用 依賴才是代碼的復(fù)用 -
常見的繼承標(biāo)簽
- groupId
- version
- properties
- dependencies
- dependencyManagement
1.3.5 dependencyManagement標(biāo)簽
依賴管理,在依賴管理標(biāo)簽定義的是依賴版本,dependencyManagement包含了一套完整的dependencies.
一旦在項目中定義了依賴管理,再使用依賴的時候,就可以省略版本號了.所以我們在父工程統(tǒng)一規(guī)劃好所有的依賴資源版本,dependencyManagement被子工程繼承之后,擁有了相同的特性,相當(dāng)于做到了資源版本的統(tǒng)一定義,子工程盡可能不重寫版本.
- 補(bǔ)充
- 父工程定義一堆dependencies 能否實現(xiàn)統(tǒng)一管理資源版本? 能.
- 為什么不用? 因為這種統(tǒng)一管理版本 是一種強(qiáng)制的繼承,讓子工程承擔(dān)了非常多不需要用到的依賴資源
結(jié)合 properties和dependencyManagement的繼承特性和標(biāo)簽的功能.父子繼承的時候最終父工程樣子按照上圖,修改maven parent demo案例
觀察一些父工程的pom文件,能夠閱讀其中的pom標(biāo)簽.
spring-boot-starter-parent
1.3.6 Maven-聚合(多模塊3)
聚合 1.3.6.1
有依賴,有繼承關(guān)系,已經(jīng)看到maven多模塊了.
一個團(tuán)隊開發(fā)項目時候,一定多模塊管理的.多人協(xié)作開發(fā),使用maven管理項目關(guān)系的.
假如項目結(jié)構(gòu):a1,a2,b1,b2是項目中4個人共同并行開發(fā)的.每個項目都是一個應(yīng)用的web程序,所以目的都是打成jar包,運(yùn)行java啟動命令
java -jar a1.jar
java -jar a2.jar
java -jar b1.jar
java -jar b2.jar
每個項目都要執(zhí)行maven聲明周期中以下幾個命令文章來源:http://www.zghlxwxcb.cn/news/detail-558981.html
- mvn clean compile 編譯
- mvn clean test 測試
- mvn clean package 打包
發(fā)現(xiàn)2個問題需要解決:
- 打包命令重復(fù)執(zhí)行很多遍.
- 執(zhí)行相同命令時,還需要額外關(guān)心項目依賴關(guān)系.
- 聚合的目的,就是為了統(tǒng)一執(zhí)行mvn相關(guān)命令的.而不需要關(guān)心,依賴關(guān)系,繼承關(guān)系,聚合本身就保管了所有的多模塊關(guān)系.
如何實現(xiàn)聚合:文章來源地址http://www.zghlxwxcb.cn/news/detail-558981.html
- 挑選一個聚合工程,聚合工程packaging類型是pom(和父工程要求是一致的)
- 聚合工程來實現(xiàn)modules配置.指向被聚合的工程(idea在創(chuàng)建工程時,自動實現(xiàn)的)
maven-parent-demo 頂級父工程
<modules>
<module>a1</module>
<module>a2</module>
</modules>
- 如果idea版本不同,在創(chuàng)建項目時,聚合的配置有所區(qū)別,有可能在頂級父工程中,聚合了所有人
- 配置完上述兩部操作,只需要對聚合工程執(zhí)行mvn命令,統(tǒng)一對被聚合工程執(zhí)行相同的命令,而且滿足依賴關(guān)系
聚合總結(jié)
- 意義: 統(tǒng)一多模塊mvn命令和順序的執(zhí)行
- 實現(xiàn): 聚合工程packaging類型pom ,指向module被聚合工程
- 本質(zhì): pom文件加載的順序,通過modules關(guān)聯(lián)起來了.
到了這里,關(guān)于Maven詳見及在Idea中的使用方法[保姆級包學(xué)包會]的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!