在一次需求迭代中,我要求同事把寫好的 RPC 接口打好包上傳到公司私服上,她直接當(dāng)場懵逼住了。
我突然發(fā)現(xiàn)它對于 Maven 僅僅是處于最基礎(chǔ)的使用階段,不僅不知道背后的一些原理,甚至連一些常見的概念都不是很清晰,僅僅會(huì)使用 Maven 構(gòu)建項(xiàng)目,引入依賴,打包等最基礎(chǔ)的操作。于是,在公司搞了一次內(nèi)部培訓(xùn),幫助大家補(bǔ)補(bǔ)課,也讓她成功的完成了需求。我在這里做一個(gè)小總結(jié),希望能夠幫助到更多的人。
依賴
依賴是我們在使用 Maven 構(gòu)建項(xiàng)目時(shí)最常使用的功能,通過依賴標(biāo)簽,我們可以直接從Maven倉庫中引入對應(yīng)的Jar包,無需手動(dòng)再將Jar添加到目錄下了,可謂是十分方便,不過我們除了使用,還需要考慮多模塊下依賴之間的關(guān)系。
依賴配置
這個(gè)大家應(yīng)該都很熟悉了,通過
? ? ????? ?????????? javax.servlet ??????????javax.servlet-api ?????
引入依賴之后,刷新一下Maven依賴就可以引入相關(guān)的Jar包了。
依賴傳遞
依賴具有傳遞性,當(dāng)我們引入了一個(gè)依賴的時(shí)候,就會(huì)自動(dòng)引入該依賴引入的所有依賴,依次往下引入所有依賴。
比如我們引入了Druid數(shù)據(jù)庫連接池的SpringBoot-Starter,那么就會(huì)自動(dòng)引入一些依賴
依賴傳遞
如圖,我們僅僅引入了druid-spring-boot-starter依賴,就自動(dòng)引入了該依賴依賴的依賴??偠灾褪翘淄蘧屯晔铝?。
我們將這三個(gè)依賴稱為間接引入的依賴,而我們在
如果重復(fù)了,遵從以下規(guī)則
Maven依賴重復(fù)后遵的規(guī)則
簡單來說,就是越在外層的優(yōu)先級越高,如果同級的就按照配置順序,配置順序靠前的覆蓋配置順序靠后的。
可選依賴
可選依賴指對外隱藏當(dāng)前所依賴的資源
? junit ?junit ?4.12 ?true
配置了該選項(xiàng)之后,間接依賴就失效了。
排除依賴
排除依賴指主動(dòng)斷開間接依賴的資源
? junit ?junit ?4.12 ??? ??? ?org.hamcrest ???hamcrest-core ??
配置了該選項(xiàng)之后,間接依賴也會(huì)失效。
排除依賴和可選依賴的區(qū)別:
可選依賴是依賴提供者設(shè)置的,比如我們引入了Durid,那么該選項(xiàng)由Durid開發(fā)者設(shè)置
排除依賴由依賴引入者設(shè)置,比如我們引入了Durid,那么我們可以設(shè)置該選項(xiàng)
依賴范圍
依賴的jar默認(rèn)情況可以在任何地方使用,可以通過scope標(biāo)簽來改變依賴的作用范圍。
依賴范圍
主代碼指的是main文件夾下的代碼,測試代碼指的是test文件夾下的代碼(就那個(gè)綠色的玩意),打包指的是maven package指令執(zhí)行時(shí)是否將Jar包打包。
其實(shí)如果我們偷懶的話,全部都默認(rèn)也不是不可能,不過為了我們程序代碼的可讀性與簡潔性,還是按照規(guī)范來比較好。
基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro
視頻教程:https://doc.iocoder.cn/video/
生命周期與插件
項(xiàng)目構(gòu)建生命周期
Maven項(xiàng)目構(gòu)建生命周期描述的是一次構(gòu)建過程經(jīng)歷了多少個(gè)事件,我們可以把生命周期當(dāng)成一個(gè)人的年齡。
Maven將生命周期劃分為三個(gè)大階段,類似于人類的嬰兒,青年,入土
clean:清理工作
default:核心工作,例如編譯,測試,打包,部署
site:產(chǎn)生報(bào)告,發(fā)布站點(diǎn)
第一個(gè)和第三個(gè)周期比較簡單,我們重點(diǎn)介紹一下default階段
先上一張勸退圖
勸退圖
以上就是defalut階段完整的生命周期,其中標(biāo)紅的地方,是幾個(gè)比較重要的周期,在Idea的Maven工具中也能體現(xiàn)出來
maven生命周期
當(dāng)我們在Idea中點(diǎn)擊這幾個(gè)生命周期時(shí),Maven會(huì)自動(dòng)將之前所有的生命周期都執(zhí)行到,就類似于如果我18歲了,那么我肯定經(jīng)歷過8歲。
插件
插件就是Idea中Maven工具的Plugins部分
Maven插件
通過pom文件中的
???????? ???????????? ???????????????? ????????org.apache.maven.plugins ????????????????maven-compiler-plugin ????????????????3.1 ???????????????????????????????????? ???????????????????? ????????????1.8 ????????????????????UTF-8 ????????????????
那么什么是插件呢?
「插件與生命周期內(nèi)的階段綁定」 ,在「執(zhí)行到對應(yīng)生命周期時(shí)執(zhí)行對應(yīng)的插件功能」
默認(rèn)maven在各個(gè)生命周期上綁定有預(yù)設(shè)的功能
通過插件可以自定義其他功能
???? ???????????? ???????????????????? ????org.apache.maven.plugins ????????????????????maven-source-plugin ????????????????????2.2.1 ???????????????????????????????????????????????? ???????????????????????????????????????????????? ???????????????????????????????????????????????????????????????? ????????????????????????????????????jar ????????????????????????????????????generate-test-resources ????????????????????????????
上述自定義插件的作用指的是在generate-test-resources生命周期執(zhí)行打jar包的操作。
其實(shí)簡單的說,生命周期就是一個(gè)人的年齡階段,而插件就是每個(gè)人在每個(gè)年齡需要做的事情
總結(jié):
總結(jié)
Maven將一個(gè)項(xiàng)目構(gòu)建的過程分為一長串連續(xù)的生命周期,在對應(yīng)的生命周期會(huì)通過插件完成對應(yīng)的事件,通過使用Maven的生命周期,我們可以獲得我們需要的功能,可能是打jar包,可能是安裝到本地倉庫,可能是部署到私服。
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
項(xiàng)目地址:https://github.com/YunaiV/yudao-cloud
視頻教程:https://doc.iocoder.cn/video/
模塊聚合
當(dāng)使用Maven進(jìn)行多模塊開發(fā)的時(shí)候,有可能出現(xiàn)A模塊依賴B模塊,B模塊依賴C模塊,那么我們?nèi)绻雽模塊打包,那么就要先打包C模塊,再打包B模塊,最后打包A模塊才能成功,否則會(huì)報(bào)錯(cuò),并且,如果C模塊更新了,我們也要手動(dòng)更新所有依賴C模塊的模塊,這樣是及不方便的,Maven為了更好的進(jìn)行多模塊開發(fā),提供了模塊聚合的功能。
作用:「聚合用于快速構(gòu)建Maven工程,一次性構(gòu)建多個(gè)項(xiàng)目/模塊」
使用步驟,我們用開源項(xiàng)目ruoyi的項(xiàng)目結(jié)構(gòu)來看一下聚合在ruoyi中的使用
項(xiàng)目結(jié)構(gòu)
RuoYi-Vue父模塊的pom文件
???????? ruoyi-admin ????????ruoyi-framework ????????ruoyi-system ????????ruoyi-quartz ????????ruoyi-generator ????????ruoyi-common pom
直接對打包類型為pom的模塊進(jìn)行生命周期的管理,Maven會(huì)自動(dòng)幫我們管理聚合的所有模塊的生命周期,操作順序跟依賴順序有關(guān)系。
模塊繼承
還是在多模塊項(xiàng)目開發(fā)中,多個(gè)子模塊可能會(huì)引入相同的依賴,但是他們有可能會(huì)各自使用不同的版本,版本問題,有可能會(huì)導(dǎo)致最后構(gòu)建的項(xiàng)目出問題,所以我們需要一種機(jī)制,來約定子模塊的相關(guān)配置,于是就有了模塊繼承
作用:通過繼承可以實(shí)現(xiàn)在子工程中沿用父工程中的配置
實(shí)現(xiàn)步驟:還是以ruoyi為例
在子工程中聲明其父工程坐標(biāo)與對應(yīng)的位置
????????? ruoyi ????????com.ruoyi ????????3.8.1 ?
在父工程中定義依賴管理
???????????????????? ???????????? ???????????????? ???????????? ????????????org.springframework.boot ????????????????spring-boot-dependencies ????????????????2.5.8 ????????????????pom ????????????????import ???????????????????????????? ???????????? ????????????com.alibaba ????????????????druid-spring-boot-starter ????????????????${druid.version} ???????????????????????????? ???????????? ????????????org.mybatis.spring.boot ????????????????mybatis-spring-boot-starter ????????????????${mybatis-spring-boot.version} ???????????????????????????? ????com.github.pagehelper ????????????????pagehelper-spring-boot-starter ????????????????${pagehelper.boot.version} ????????????
定義完成之后,子工程相關(guān)的依賴就無需定義版本號(hào),會(huì)直接使用父工程的版本號(hào)
???????????? com.github.pagehelper ????????????pagehelper-spring-boot-starter
繼承除了依賴版本號(hào)之外,還會(huì)繼承一些資源,如下圖
模塊繼承
屬性
在Maven中,對于有些依賴可能需要保證相同的版本,比如Spring相關(guān)依賴,那么我們就需要一個(gè)機(jī)制來保證這些依賴的版本都相同,我們可以使用Maven中的屬性,類似編程語言的全局變量。
Maven中有很多屬性:
自定義屬性
內(nèi)置屬性
Setting屬性
Java系統(tǒng)屬性
環(huán)境變量屬性
此處我們重點(diǎn)講解一下
自定義屬性
作用:將一些字符串定義為變量,方便統(tǒng)一維護(hù)
使用步驟:還是以ruoyi為例
定義自定義屬性
???????? 3.8.1
調(diào)用:${xxx.yyy}
com.ruoyi ruoyi ${ruoyi.version}
內(nèi)置屬性
作用:使用Maven內(nèi)置屬性,快速配置一些文件
${basedir} ${version}
Setting屬性
作用:使用Maven配置文件setting.xml中的標(biāo)簽屬性,用于動(dòng)態(tài)配置
${settings.localRepository}
Java系統(tǒng)屬性
作用:讀取Java系統(tǒng)屬性
調(diào)用格式
${user.home}
系統(tǒng)屬性查詢方式
mvn?help:system
環(huán)境變量屬性
作用:使用Maven環(huán)境變量
${env.JAVA_HOME}
版本管理
對于我們的項(xiàng)目來說,如果我們將其放到一些Maven倉庫中,那么就需要對其進(jìn)行版本控制,我們可以看一下一些開源項(xiàng)目的Maven官網(wǎng)上的版本。
版本管理
pom文件配置
工程版本號(hào)約定
工程版本號(hào)約定
工程版本
工程版本
環(huán)境配置
一個(gè)項(xiàng)目,開發(fā)環(huán)境、測試環(huán)境、生產(chǎn)環(huán)境的配置文件必然不同,那么Maven就需要進(jìn)行多環(huán)境配置管理
Maven多環(huán)境對應(yīng)Idea中Maven工具的Profiles
環(huán)境配置
配置文件:通過
???????? ???????????? ????????local ???????????????????????????? ???????????????? ????????local ????????????????debug ???????????????????????? ????????dev ???????????????????????????? ???????????????? ????????????dev ????????????????debug ???????????????????????????? ???????????????? ????????true ???????????????????????? ????????test ???????????????????????????? ????????test ????????????????debug ???????????????????????? prod ???????????????????????????? ????????prod ????????????????warn ????????????
然后我們在application.yml配置文件中設(shè)置即可,之后通過設(shè)置maven的profiles,就可以動(dòng)態(tài)調(diào)整環(huán)境了。
動(dòng)態(tài)調(diào)整環(huán)境
私服
Maven私服指的是企業(yè)自己搭建的Maven倉庫,通過Maven私服,第三方組織可以把自己組織內(nèi)部的Maven依賴安裝到私服上,提供給組織內(nèi)部使用,搭建完私服之后,通過配置Maven,我們不止可以從中央倉庫中獲取Maven依賴,還可以從私服中獲取Maven依賴。
下圖是獲取資源的過程,中央倉庫的資源會(huì)從中央倉庫獲取,其他資源會(huì)從私服倉庫獲取
Maven私服
私服搭建
通過Nexus搭建私服
Nexus是Sonatype公司的一款Maven私服產(chǎn)品
下載地址:https://help.sonatype.com/repomanager3/product-information/download
私服搭建
私服倉庫介紹
安裝好之后我們來看一下私服默認(rèn)的倉庫列表
私服倉庫
可以將這些倉庫分為三大類
「宿主倉庫hosted」 :保存無法從中央倉庫獲取的資源
自主研發(fā)
第三方非開源項(xiàng)目
「代理倉庫proxy」
代理遠(yuǎn)程倉庫,通過nexus訪問其他公共倉庫
「倉庫組」 :將若干個(gè)倉庫組成一個(gè)群組,簡化配置,它僅僅是一種配置,不是真實(shí)的倉庫
比如我們可以將二課項(xiàng)目相關(guān)的依賴放到一個(gè)倉庫組中,將抽獎(jiǎng)項(xiàng)目的依賴放到一個(gè)倉庫組中
創(chuàng)建私服倉庫
點(diǎn)擊create repository
創(chuàng)建私服倉庫
選擇maven2(hosted)
選擇maven2
填入倉庫名稱
填入倉庫名稱
創(chuàng)建完之后在倉庫列表可見,將新建的倉庫加入maven-public倉庫組,之后通過該倉庫組的url訪問
倉庫列表
點(diǎn)擊maven-public倉庫組
倉庫組
本地倉庫訪問私服配置
配置本地倉庫訪問私服的權(quán)限(setting.xml文件),如果你想從這個(gè)倉庫中獲取或者部署資源,那么就需要server配置來驗(yàn)證權(quán)限,此處可以是不同的賬號(hào)密碼,不同的用戶對于倉庫的權(quán)限也不同。
「配置Servers」
???? ???????????? ????ticknet-release ????????????admin ????????????admin ???????????????? ticknet-snapshots ????????????admin ????????????admin ????
「配置setting.xml的Profiles」
???? ???????? artifactory ???????????????????? ???????????????????? ???????????????????????????????? ????????????????false ????????????????repo ????????????????repo ????????????????xxxx ???????????????????????????? ???????????????????????? snapshots ????????????????snapshots-only ????????????????xxxx ????????????
此處的URL通過這個(gè)copy按鈕獲取。
copy按鈕獲取URL
「配置激活profiles」
????????? artifactory ?
之后就可以從私服獲取資源了
上傳資源到私服
配置項(xiàng)目pom文件
???? ???????? ????ticknet-release ????????http://localhost:8081/repository/ticknet-release/ ???????????? ticknet-snapshots ????????http://localhost:8081/repository/ticknet-release/ ????
配置完執(zhí)行生命周期的deploy即可
OK,大功告成。
為了規(guī)范一個(gè)復(fù)雜項(xiàng)目中所有子模塊的依賴版本,防止出現(xiàn)兩個(gè)子模塊a,b引用同一個(gè)依賴,但是一個(gè)的版本是1.0,一個(gè)的版本是2.0的這種情況。
比如子模塊a和b,都引入了x,y,z三個(gè)依賴,這三個(gè)依賴的版本都要求是相同的的才能匹配上,此時(shí)子模塊a引入的是1.0的版本,子模塊b引入的是2.0的版本,那么最后可能會(huì)出現(xiàn)版本不相同導(dǎo)致匹配不上的問題。所以都在父工程的
編輯:黃飛
評論
查看更多