遠(yuǎn)程辦公”">國(guó)務(wù)院聯(lián)防聯(lián)控機(jī)制新聞發(fā)布會(huì),多次肯定“云辦公”、“遠(yuǎn)程辦公”
1145
2025-03-31
一、什么是Maven
Maven是Apache下的一個(gè)純Java開(kāi)發(fā)的開(kāi)源項(xiàng)目,是一個(gè)項(xiàng)目管理工具,用于構(gòu)建和管理任何基于java的項(xiàng)目:
構(gòu)建:Maven通過(guò)一套統(tǒng)一標(biāo)準(zhǔn)的構(gòu)建方法來(lái)構(gòu)建maven項(xiàng)目,并明確定義項(xiàng)目的組成結(jié)構(gòu)。
管理:Maven根據(jù)其生命周期去管理項(xiàng)目,包括依賴、測(cè)試、打包、發(fā)布等;可以實(shí)現(xiàn)多個(gè)項(xiàng)目共享jar包。
Maven提供倉(cāng)庫(kù)管理、依賴管理、插件拓展、繼承和聚合等特性為項(xiàng)目的構(gòu)建和管理提供了一整套完善的解決方案。
二、Maven使用場(chǎng)景
希望統(tǒng)一的方式構(gòu)建java項(xiàng)目(提供項(xiàng)目統(tǒng)一的目錄結(jié)構(gòu))
需要項(xiàng)目jar包的統(tǒng)一管理,依賴管理(提供項(xiàng)目倉(cāng)庫(kù)管理)
希望能對(duì)項(xiàng)目進(jìn)行快速的編譯、測(cè)試、打包等操作(提供項(xiàng)目生命周期管理)
還可以進(jìn)行插件拓展,如自己開(kāi)發(fā)的maven插件專(zhuān)門(mén)對(duì)java項(xiàng)目代碼規(guī)范掃描也可以集成到maven中,可以使用該插件在項(xiàng)目打包之前進(jìn)行項(xiàng)目掃描(提供插件輔助項(xiàng)目開(kāi)發(fā))
三、Maven安裝使用流程
前提條件
maven是純java開(kāi)發(fā)的項(xiàng)目管理工具,因此需要安裝JDK,配置JDK環(huán)境變量。
安裝:
根據(jù)JDK版本下載對(duì)應(yīng)的Maven版本:
https://maven.apache.org/docs/history.html (版本對(duì)照說(shuō)明)
https://archive.apache.org/dist/maven/maven-3/ (下載對(duì)應(yīng)版本,下載二進(jìn)制文件zip或者tar.gz都可以)
解壓zip或tar.gz包到指定目錄(安裝目錄)
將安裝目錄里面的bin目錄路徑,配置添加到path環(huán)境變量中即可。
最后在終端輸入命令:mvn -v 驗(yàn)證返回maven版本信息即表示安裝成功。
配置maven的本地倉(cāng)庫(kù):在安裝目錄找到settings.xml配置文件,修改
在IDEA中配置使用Maven:IDEA現(xiàn)在都自帶Maven,我們可以根據(jù)需要使用自己安裝的Maven或者保留修改自帶的也行。
使用流程(項(xiàng)目構(gòu)建)
項(xiàng)目構(gòu)建包含源代碼的編寫(xiě)、編譯、測(cè)試、運(yùn)行、打包、部署、運(yùn)行的過(guò)程。
傳統(tǒng)的項(xiàng)目構(gòu)建過(guò)程:
在開(kāi)發(fā)工具如IDEA中創(chuàng)建一個(gè)java工程
在工程中編寫(xiě)源代碼及配置文件
對(duì)源代碼進(jìn)行編譯(將java源文件編譯成class文件)
執(zhí)行Junit進(jìn)行單元測(cè)試
將工程打成jar包或者war包部署運(yùn)行
maven的項(xiàng)目構(gòu)建過(guò)程(一般過(guò)程):
在開(kāi)發(fā)工具如IDEA新建一個(gè)maven項(xiàng)目,并編寫(xiě)java源代碼。
清除階段:mvn clean,清除所有class文件。
編譯階段:mvn compile,將java源代碼編譯成class文件
測(cè)試階段:mvn test,執(zhí)行單元測(cè)試
打包階段:mvn package,將java工程打包成jar包或war包
安裝本地倉(cāng)庫(kù)階段:mvn install,將打包好的jar/war包安裝到本地倉(cāng)庫(kù)
發(fā)布遠(yuǎn)程倉(cāng)庫(kù)階段:mvn deploy,將打包好的jar/war包發(fā)布上傳到遠(yuǎn)程倉(cāng)庫(kù)
每執(zhí)行一個(gè)階段都會(huì)把前面的階段按順序執(zhí)行;使用Maven構(gòu)建項(xiàng)目的優(yōu)勢(shì):統(tǒng)一命令完成項(xiàng)目生命周期管理,規(guī)范項(xiàng)目構(gòu)建,方便管理和團(tuán)隊(duì)協(xié)作。
注意打包階段的兩點(diǎn)問(wèn)題:
第一:src/main下內(nèi)容最終會(huì)打包到Jar/War中,而src/test下是測(cè)試內(nèi)容,并不會(huì)打包進(jìn)去。
第二:src/main/resources中的資源文件會(huì)COPY至目標(biāo)目錄,這是Maven的默認(rèn)生命周期中的一個(gè)規(guī)定動(dòng)作。(想一想,hibernate/mybatis的映射XML需要放入resources下,而不能在放在其他地方了)
四、Maven倉(cāng)庫(kù)管理
maven倉(cāng)庫(kù)分為兩種類(lèi)型:本地倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù)。
本地倉(cāng)庫(kù):是指在安裝Maven后創(chuàng)建在本機(jī)的倉(cāng)庫(kù),maven運(yùn)行項(xiàng)目構(gòu)建所需要的jar包都是來(lái)自本地倉(cāng)庫(kù),如果沒(méi)有所需的jar包先去遠(yuǎn)程倉(cāng)庫(kù)下載到本地倉(cāng)庫(kù)。涉及本地倉(cāng)庫(kù)的幾種場(chǎng)景:
settings.xml本地倉(cāng)庫(kù)配置:
若本地和遠(yuǎn)程倉(cāng)庫(kù)都沒(méi)有所需的jar包/pom文件,則需要手動(dòng)找到j(luò)ar包/pom文件后install到本地倉(cāng)庫(kù):
手動(dòng)安裝jar包:
mvn install:install-file -Dfile=
手動(dòng)安裝pom文件(maven-install-plugin插件版本2.5以上):
mvn install:install-file -Dfile=
安裝好在本地倉(cāng)庫(kù)的jar包或pom文件后,需要上傳到遠(yuǎn)程倉(cāng)庫(kù),已達(dá)到開(kāi)發(fā)共享:
mvn deploy:deploy-file -DgroupId=
或者使用pom文件定義需要上傳包的groupId,artifactId,version和packaging等信息,使用下面命令:
mvn deploy:deploy-file -DpomFile=
遠(yuǎn)程倉(cāng)庫(kù):分為私服倉(cāng)庫(kù)和中央倉(cāng)庫(kù),可以配置多個(gè)遠(yuǎn)程倉(cāng)庫(kù),在setting.xml或pom.xml都可以配置。
私服倉(cāng)庫(kù):就是自己工作開(kāi)發(fā)或公司內(nèi)部自己搭建的一個(gè)局域網(wǎng)共享倉(cāng)庫(kù)服務(wù)器。
中央倉(cāng)庫(kù):是由第三方提供的遠(yuǎn)程倉(cāng)庫(kù),默認(rèn)為maven倉(cāng)庫(kù)id=central,不需要配置(https://repo.maven.apache.org/maven2/)。
使用遠(yuǎn)程倉(cāng)庫(kù)的優(yōu)點(diǎn):使用遠(yuǎn)程倉(cāng)庫(kù),提高開(kāi)發(fā)者之間的交互;配置多個(gè)遠(yuǎn)程倉(cāng)庫(kù),減少對(duì)依賴下載的壓力,提高性能和構(gòu)建穩(wěn)定性。配置多個(gè)遠(yuǎn)程倉(cāng)庫(kù)涉及在以下地方:
子項(xiàng)目pom.xml/父項(xiàng)目pom.xml文件(私服倉(cāng)庫(kù)):
Maven全局/用戶配置文件settings.xml(私服倉(cāng)庫(kù)):
Maven全局配置文件settings.xml(遠(yuǎn)程倉(cāng)庫(kù)鏡像,代理作用):
maven倉(cāng)庫(kù)依賴大概訪問(wèn)順序:本地倉(cāng)庫(kù)(local)--> 遠(yuǎn)程倉(cāng)庫(kù)(私服) --> 遠(yuǎn)程倉(cāng)庫(kù)(中央倉(cāng)庫(kù))
依賴具體訪問(wèn)順序:local_repo --> settings_profile_repo($Maven_HOME/conf/settings > $User_home/conf/settings) -->pom_repostitorues(多個(gè)倉(cāng)庫(kù)按聲明倒序) --> settings_mirrors --> central
三者的關(guān)系:
五、Maven依賴管理
Maven項(xiàng)目依賴的第三方項(xiàng)目jar包,通過(guò)maven規(guī)范化管理:在pom.xml文件中配置,maven運(yùn)行時(shí)會(huì)自動(dòng)從maven倉(cāng)庫(kù)(上面三大倉(cāng)庫(kù))中查找下載。
傳統(tǒng)項(xiàng)目的依賴管理:
手工從網(wǎng)上下載所依賴的jar包到本地
手工拷貝jar包并添加到j(luò)ava工程中。
容易造成jar包的版本沖突的問(wèn)題
網(wǎng)上人工查找依賴包費(fèi)時(shí)、效率低,直接拷貝添加到工程中會(huì)導(dǎo)致工程體積過(guò)大等問(wèn)題。
Maven項(xiàng)目的依賴管理:
通過(guò)maven倉(cāng)庫(kù)統(tǒng)一存儲(chǔ)依賴包,方便查找、自動(dòng)下載與使用。
通過(guò)pom.xml統(tǒng)一版本依賴管理,使用groupId、artifactId、version進(jìn)行jar包版本坐標(biāo)定位,減少版本沖突。
maven可以平臺(tái)使用,方便快捷。
具體使用
在pom.xml配置文件中使用標(biāo)簽
依賴傳遞:如果A依賴B,B依賴C,那么引入A,意味著B(niǎo)和C都會(huì)被引入。
Maven的最近依賴策略:如果一個(gè)項(xiàng)目依賴相同的groupId、artifactId的多個(gè)版本,那么在依賴樹(shù)(mvn dependency:tree)中離項(xiàng)目最近的那個(gè)版本將會(huì)被使用。(Gradle用的是version+策略)
解決依賴沖突
方式1:要使用哪個(gè)版本,我們是清楚的,不管如何依賴傳遞,可以進(jìn)行版本鎖定
使用
方式2:在依賴傳遞中,去掉我們不想依賴的。
使用
方式3:最近依賴策略,我們就直接使用顯式依賴指定版本。
使用
如果我們新加入一個(gè)依賴的話,那么先通過(guò)mvn dependency:tree命令形成依賴樹(shù),看看我們新加入的依賴,是否存在傳遞依賴,傳遞依賴中是否和依賴樹(shù)中的版本存在沖突,如果存在多個(gè)版本沖突,利用上面的方式進(jìn)行解決!
六、Maven生命周期
執(zhí)行后面的命令時(shí),前面的命令自動(dòng)得到執(zhí)行。實(shí)際上,我們最常用的就是這么幾個(gè):
clean:有問(wèn)題,多清理!
package:打成Jar or War包,會(huì)自動(dòng)進(jìn)行clean+compile
install:將本地工程Jar上傳到本地倉(cāng)庫(kù)
deploy:上傳到私服
七.?scope依賴范圍
既然,Maven的生命周期存在編譯、測(cè)試、運(yùn)行這些過(guò)程,那么顯然有些依賴只用于測(cè)試,比如junit;有些依賴編譯用不到,只有運(yùn)行的時(shí)候才能用到,比如mysql的驅(qū)動(dòng)包在編譯期就用不到(編譯期用的是JDBC接口),而是在運(yùn)行時(shí)用到的;還有些依賴,編譯期要用到,而運(yùn)行期不需要提供,因?yàn)橛行┤萜饕呀?jīng)提供了,比如servlet-api在tomcat中已經(jīng)提供了,我們只需要的是編譯期提供而已。總結(jié)來(lái)說(shuō):
compile:默認(rèn)的scope,運(yùn)行期有效,需要打入包中。
provided:編譯期有效,運(yùn)行期不需要提供,不會(huì)打入包中。
runtime:編譯不需要,在運(yùn)行期有效,需要導(dǎo)入包中。(接口與實(shí)現(xiàn)分離)
test:測(cè)試需要,不會(huì)打入包中。
system:非本地倉(cāng)庫(kù)引入、存在系統(tǒng)的某個(gè)路徑下的jar。(一般不使用)
Java Maven 項(xiàng)目管理 ProjectMan
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。