【JAVA項(xiàng)目管理】【Maven】一篇搞定maven

      網(wǎng)友投稿 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)景

      【JAVA項(xiàng)目管理】【Maven】一篇搞定maven

      希望統(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配置文件,修改標(biāo)簽即可。

      在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ù)配置:

      /path/to/local/repo

      若本地和遠(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= -DgroupId= -DartifactId= -Dversion= -Dpackaging=

      手動(dòng)安裝pom文件(maven-install-plugin插件版本2.5以上):

      mvn install:install-file -Dfile= -DpomFile=

      安裝好在本地倉(cāng)庫(kù)的jar包或pom文件后,需要上傳到遠(yuǎn)程倉(cāng)庫(kù),已達(dá)到開(kāi)發(fā)共享:

      mvn deploy:deploy-file -DgroupId= \ -DartifactId= \ -Dversion= \ -Dpackaging= \ -Dfile= \ -DrepositoryId= \ -Durl=

      或者使用pom文件定義需要上傳包的groupId,artifactId,version和packaging等信息,使用下面命令:

      mvn deploy:deploy-file -DpomFile= \ -Dfile= \ -DrepositoryId= \ -Durl=

      遠(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ù)):

      ... Remove Repo id1 Remove Repo name1 http://Remove Repo Addr1 Remove Repo id2 Remove Repo name2 http://Remove Repo Addr2 ...

      Maven全局/用戶配置文件settings.xml(私服倉(cāng)庫(kù)):

      ... ... myprofile Remove Repo id2 Remove Repo name2 http://Remove Repo Addr2 ... myprofile ...

      Maven全局配置文件settings.xml(遠(yuǎn)程倉(cāng)庫(kù)鏡像,代理作用):

      ... other-mirror Other Mirror Repository central https://other-mirror.repo.other-company.com/maven2 ...

      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)簽來(lái)依賴第三方j(luò)ar包,使用坐標(biāo):groupId、artifactId、version來(lái)定位具體版本

      servlet-api servlet-api 2.5 system ${project.basedir}/libs/servlet-api-2.5.jar

      依賴傳遞:如果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:在依賴傳遞中,去掉我們不想依賴的。

      使用 [在實(shí)際中我們可以在IDEA中直接利用插件幫助我們生成]

      方式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)容。

      上一篇:刪除word表格中的行或列的方法(word表格怎樣刪除行列)
      下一篇:怎么刪除word表格的列或行(word里面的表格如何刪除行)
      相關(guān)文章
      久久被窝电影亚洲爽爽爽| 久久亚洲2019中文字幕| 亚洲色偷拍另类无码专区| 亚洲av日韩av欧v在线天堂| 亚洲国产欧美一区二区三区| 亚洲免费在线观看视频| 亚洲国产av一区二区三区丶| 亚洲第一网站免费视频| 亚洲精品mv在线观看 | 亚洲精品中文字幕乱码| 亚洲黄色免费网址| 亚洲欧洲国产综合| 亚洲在成人网在线看| 亚洲AV无码国产精品色| 77777亚洲午夜久久多喷| 亚洲人成77777在线观看网| 一本色道久久88—综合亚洲精品 | 亚洲偷自精品三十六区| 日韩亚洲产在线观看| 亚洲中文无码永久免| 亚洲第一综合天堂另类专| 毛片亚洲AV无码精品国产午夜| 在线观看亚洲网站| 国产L精品国产亚洲区久久| 亚洲综合色自拍一区| 亚洲Av综合色区无码专区桃色 | 亚洲AV无码精品国产成人| 无码天堂va亚洲va在线va| 亚洲国产精品成人久久蜜臀 | 亚洲国产成人久久精品99 | 涩涩色中文综合亚洲| 色偷偷亚洲男人天堂| 亚洲男人第一无码aⅴ网站| 亚洲中文字幕无码一区二区三区| 亚洲精品无码Av人在线观看国产 | 无码专区—VA亚洲V天堂| 亚洲日本视频在线观看| 一本色道久久88亚洲精品综合| 国产午夜亚洲精品不卡免下载 | 久久精品国产精品亚洲人人 | 亚洲AV无码一区二区一二区|