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