maven入門學(xué)習(xí)

? ?? ?? ?因為入行Java比較著急,很多知識點都沒有系統(tǒng)的學(xué)習(xí),比如這個maven。當(dāng)工作開始接觸復(fù)雜的項目的時候,對于一些基礎(chǔ)的東西都不掌握就很吃力了。因此專門抽出一些時間來重新學(xué)習(xí)一下。
? ?? ?? ?本文是在學(xué)習(xí)了B站上尚硅谷的一套maven課程后的整理的一部分筆記。這個課程講的真不錯,中間偶爾會穿插老師的一點一點的小心得,個人感覺點非常正。不過這個課程因為加入了三部分的項目內(nèi)容顯得特別長,如果是工作一段時間只想看看maven的小伙伴們可以跳過中間的項目部分,對于剛?cè)腴Tjava的小伙伴跟著老師全都學(xué)下來還是挺不錯的。這個是B站視頻的鏈接:[https://www.bilibili.com/video/BV12q4y147e4?p=1]

什么是maven?有什么作用

? ?? ?? ?來看看官網(wǎng)的定義:Maven是一個軟件項目管理和理解工具?;陧椖繉ο竽P停≒OM)的概念,Maven可以從中心信息塊管理項目的構(gòu)建、報告和文檔。
? ?? ?? ?結(jié)合工作和學(xué)習(xí)簡單來說,maven其實是一個項目管理工具。核心功能是依賴管理構(gòu)建。
? ?? ?? ?當(dāng)我們的項目越來越復(fù)雜,不可避免要引入大量的依賴包,還有可能涉及到不同的包需要依賴同一個包的不同版本,如果管理這些依賴,是一個很復(fù)雜的事情,maven就是專門幫我們管理這個。
? ?? ?? ?所謂構(gòu)建其實就是編譯,打包,安裝,這一系列操作。

maven的下載與安裝

? ?? ?? ?maven下載安裝比較簡單,直接進(jìn)入官網(wǎng),download,下載這個zip包就可以


maven下載地址.png

? ?? ?? ?下載后找一個專門的目錄,解壓,然后配置一下環(huán)境變量(類似JDK環(huán)境變量的配置)就可以使用了。
? ?? ?? ?測試安裝:在cmd窗口中輸入:mvn -v


maven測試安裝.png

? ?? ?? ?安裝完之后,需要修改一些配置。配置文件路徑:安裝目錄\conf\settings.xml,比如我自己的:D:\Soft\JAVA\apache-maven-3.8.4\conf\settings.xml
? ?? ?? ?1、本地倉庫地址,自己新建一個文件夾專門用來存放maven會用到的包。默認(rèn)是在用戶家目錄/.m2/repository。這在C盤,時間長了這里會越來越占地方,還是自己找一個專門的地方存,這樣之后找起來也方便。
本地倉庫地址.png

? ?? ?? ?2、鏡像地址,也就是下載jar包的來源,默認(rèn)是maven的中央倉庫,這個地址在國外,訪問起來肯定很慢,配置一個國內(nèi)的鏡像源,可以加速訪問,常用的比如阿里的鏡像。如果是工作中,有的公司有自己的私服(自己公司的maven倉庫),就需要在這個mirror標(biāo)簽中配置公司的私服地址。


阿里鏡像源.png

? ?? ?? ?3、指定jdk的版本
jdk版本.png

? ?? ?? ?IDEA中的使用,完成以上配置之后,就可以在IDEA中使用了,新建一個工程后,file -> setting -> Build,Execution,Deployment -> Build Tools -> Maven,修改成自己的配置:


idea的配置.png

? ?? ?? ?IDEA本身是自帶maven的,簡單的項目使用自帶的就可以滿足需求,但是項目復(fù)雜了之后就需要自己配置了。所以還是自己搞一個先玩一玩吧。

maven的使用

? ?? ?? ?創(chuàng)建項目,可以使用命令行創(chuàng)建一個maven項目,不過工作中肯定是用不到的,所以直接就用IDEA創(chuàng)建吧。創(chuàng)建的maven項目結(jié)構(gòu):


目錄結(jié)構(gòu).png

? ?? ?? ?創(chuàng)建的過程中會讓你輸入這個項目的坐標(biāo),創(chuàng)建之后在pom文件中會體現(xiàn)出來:

//公司或組織域名的倒序
<groupId>org.wen.erp</groupId>
//項目名稱
<artifactId>managerment</artifactId>
//項目版本號
<version>1.0-SNAPSHOT</version>

? ?? ?? ?注意:這個坐標(biāo)是可以定位到我們的項目的jar包在倉庫中的位置(但是得打包安裝之后才會有)。比如這個:

jar在倉庫中的位置.png

? ?? ?? ?pom文件的內(nèi)容

<!-- 當(dāng)前Maven工程的坐標(biāo) -->
    <groupId>com.wen.erp</groupId>
    <artifactId>managerment</artifactId>
    <version>1.0-SNAPSHOT</version>
  
  <!-- 當(dāng)前Maven工程的打包方式,可選值有下面三種: -->
  <!-- jar:表示這個工程是一個Java工程  -->
  <!-- war:表示這個工程是一個Web工程 -->
  <!-- pom:表示這個工程是“管理其他工程”的工程 -->
  <packaging>jar</packaging>

  <name>pro01-maven-java</name>
  <url>http://maven.apache.org</url>

  <properties>
    <!-- 工程構(gòu)建過程中讀取源碼時使用的字符集 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <!-- 當(dāng)前工程所依賴的jar包 -->
  <dependencies>
    <!-- 使用dependency配置一個具體的依賴 -->
    <dependency>
    
      <!-- 在dependency標(biāo)簽內(nèi)使用具體的坐標(biāo)依賴我們需要的一個jar包 -->
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      
      <!-- scope標(biāo)簽配置依賴的范圍 -->
      <scope>test</scope>
    </dependency>
  </dependencies>
構(gòu)建命令

? ?? ?? ?在idea中,可以直接對工程執(zhí)行maven中的一些命令來進(jìn)行一些操作,這些命令的內(nèi)容可以說是maven的核心功能,理解這些命令的作用對于理解maven很重要。


idea中的maven命令.png

? ?? ?? ?clean:清理編譯打包的結(jié)果,就是把之前的target目錄刪掉。
? ?? ?? ?compile:編譯,將我們的源代碼轉(zhuǎn)換成.class文件
? ?? ?? ?test:編寫代碼后再test目錄下我們會寫一些測試程序,這個命令就會幫我們直接執(zhí)行測試程序。
? ?? ?? ?package:將我們的項目按照pom中約定的打包方式,打成對應(yīng)的包,放在target目錄下,如果是jar,會直接生成一個jar包放在target下,但是如果是war,必須要有web.xml,然后才能打包,打包后target目錄下會生成一個war包,還有一個目錄,直接就是war包解壓后的文件夾,部署的時候可以直接用這個文件夾。
? ?? ?? ?isntall:安裝,意思是把我們生成的jar包放置到本地倉庫中??梢栽囋囎约航ㄒ粋€項目,安裝以下,然后根據(jù)坐標(biāo)到本地倉庫中去找。

依賴管理

? ?? ?? ?maven一個核心功能就是依賴管理,我們可以把我們需要的依賴包都引入到項目中,通過maven幫我們管理,具體就是把這些信息在pom文件中體現(xiàn)出來。參考前面的pom文件中的dependencies標(biāo)簽。

依賴范圍

? ?? ?? ?依賴標(biāo)簽中有一個scope標(biāo)簽,表示這個依賴生效的范圍。具體的值都有:
? ?? ?? ?compile:編譯,不寫的化就默認(rèn)是這個。這個范圍表示在任何時間任何地點都是生效的。
? ?? ?? ?test:測試??臻g上,在test目錄下有效而在main目錄下無效;時間上,在本地開發(fā)階段有效,部署上線之后就不生效了。這個應(yīng)該比較好理解。
? ?? ?? ?provided:有一些服務(wù)器上的包比如servlet-api、jsp-api,開發(fā)的時候我們會用到,但是部署到服務(wù)器就沒必要了,甚至可能會產(chǎn)生沖突,所以部署到服務(wù)器上就不生效了。意思就是:服務(wù)器上已經(jīng)有了,你就別帶啦。
? ?? ?? ?還有幾個不常用,這個范圍其實我們不能亂寫,但是也不必太糾結(jié),如果我們不知道范圍是什么,在https://mvnrepository.com/repos/central中我們搜到的依賴包就會提供這個范圍,直接用就好了。

依賴傳遞:

? ?? ?? ?關(guān)于依賴,如果項目復(fù)雜了,依賴還有依賴,依賴的鏈條可能會很長,那么依賴是可以進(jìn)行傳遞的,比如A依賴B,B依賴C,那么其實A也會依賴到C,但是A能不能直接使用C,得看B使用C是的依賴范圍:如果是compile,C就可以傳遞到A,如果是test或provided,就不能傳遞到A。
? ?? ?? ?可以使用命令查看:mvn dependency:tree(需要查看哪個工程,就在哪個工程里點擊)


maven命令行.png

? ?? ?? ?比如這個,我在salary中依來了auth,在auth中依賴了junit,但是查看salary的依賴并沒有發(fā)現(xiàn)junit


依賴傳遞.png
依賴排除:

? ?? ?? ?當(dāng)某一個依賴通過不同的依賴鏈依賴到某一個包的不同版本,maven會如何選擇使用哪一個版本,兩個原則:路徑短的優(yōu)先,路徑相同的先聲明的優(yōu)先。

依賴排除:在依賴管理中還有個問題,依賴沖突,比如A依賴B,B依賴C(1.0版本),同時A依賴D,D依賴C(2.0版本)。兩個版本發(fā)生了沖突,但我們只保留其中一個,就可以使用排除。
A-B-C.png

? ?? ?? ?比如:我在salary中依賴了auth,還依賴了log4j的1.2.17,而在auth中依賴了log4j的1.2.12,那如果我想把a(bǔ)uth中的log4j排除掉就可以在salary中的auth依賴添加排除:

依賴排除.png
聚合工程

? ?? ?? ?所謂聚合工程其實就是在一個工程下面創(chuàng)建多個子工程,這時候要主意,父工程的打包方式需要改成pom
? ?? ?? ?父工程進(jìn)行總的依賴管理:

//父工程坐標(biāo)
<groupId>com.wen.erp</groupId>
<artifactId>managerment</artifactId>
<version>1.0-SNAPSHOT</version>

//打包方式
<packaging>pom</packaging>

//子工程都會出現(xiàn)在modules標(biāo)簽中
<modules>
    <module>auth</module>
    <module>salary</module>
</modules>

//依賴的版本
<properties>
    <spring-cloud.version>2020.0.5</spring-cloud.version>
    <springboot.version>2.5.7</springboot.version>
</properties>

//依賴管理
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${springboot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version> //版本通過properties管理,使用的使用可以通過${}來獲取
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

? ?? ?? ?子工程中,需要使用的依賴可以省去版本號,但是這個依賴還是需要添加的,只不過可以直接使用父工程統(tǒng)一管理的版本,當(dāng)然這里也可以指定自己需要的版本,但一般不這樣處理。

//會先聲明父工程的坐標(biāo)
<parent>
    <artifactId>managerment</artifactId>
    <groupId>com.wen.erp</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>
//子工程的坐標(biāo)就會省去artifactId和version
<artifactId>auth</artifactId>

//子工程的依賴
<dependencies>
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-dependencies</artifactId>
     </dependency>
     <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-dependencies</artifactId>
     </dependency>
</dependencies>
生命周期

? ?? ?? ?作用:我的理解是maven給你定義了幾個命令包,供你使用方便,在這一個包中包含了多個命令,你選擇其中一條執(zhí)行,這條命令之前的命令會一起執(zhí)行。(這里其實我不是很理解,先記錄下來,之后再思考吧)
? ?? ?? ?三個生命周期:

生命周期名稱 作用 各個環(huán)節(jié)
Clean 清理操作相關(guān) pre-clean
clean
post-clean
Site 生成站點相關(guān) pre-site
site
post-site
deploy-site
Default 主要構(gòu)建過程 validate generate-sources process-sources generate-resources process-resources 復(fù)制并處理資源文件,至目標(biāo)目錄,準(zhǔn)備打包。 compile 編譯項目 main 目錄下的源代碼。 process-classes generate-test-sources process-test-sources generate-test-resources process-test-resources 復(fù)制并處理資源文件,至目標(biāo)測試目錄。 test-compile 編譯測試源代碼。 process-test-classes test 使用合適的單元測試框架運(yùn)行測試。這些測試代碼不會被打包或部署。 prepare-package package 接受編譯好的代碼,打包成可發(fā)布的格式,如JAR。 pre-integration-test integration-test post-integration-test verify install將包安裝至本地倉庫,以讓其它項目依賴。 deploy將最終的包復(fù)制到遠(yuǎn)程的倉庫,以讓其它開發(fā)人員共享;或者部署到服務(wù)器上運(yùn)行(需借助插件,例如:cargo)。

? ?? ?? ?特點:

  • 這三個生命周期彼此是獨立的。
  • 在任何一個生命周期內(nèi)部,執(zhí)行任何一個具體環(huán)節(jié)的操作,都是從本周期最初的位置開始執(zhí)行,直到指定的地方。
插件和目標(biāo)

? ?? ?? ?maven命令行的命令:mvn compile:testCompile
? ?? ?? ?Maven的核心程序只負(fù)責(zé)宏觀調(diào)度,具體的工作是由一個個的插件來完成的,比如我我們執(zhí)行上面這個編譯命令,mvn相當(dāng)于maven的核心程序,而compile其實是maven調(diào)用的一個插件,之后的testCompile其實這個這個插件對應(yīng)的一個目標(biāo)。
? ?? ?? ?maven會有多個插件,而一個插件又可能會有多個目標(biāo),這個目標(biāo)似乎可以理解為一個一個小的執(zhí)行環(huán)節(jié)。
? ?? ?? ?這個可以參考老師給出的原理圖加以理解:


maven工作原理.png
倉庫

? ?? ?? ?倉庫就是存放jar包的地方
? ?? ?? ?本地倉庫:我們下載完maven之后配置的那個目錄,我們在項目中使用到的依賴都會被下載到這個倉庫中,下次再使用就直接從本地獲取了。
? ?? ?? ?遠(yuǎn)程倉庫:
? ?? ?? ?? ?? ?? ?互聯(lián)網(wǎng):
? ?? ?? ?? ?? ?? ?? ?? ?? ?中央倉庫:可以理解為maven的官方倉庫
? ?? ?? ?? ?? ?? ?? ?? ?? ?鏡像倉庫:相當(dāng)于中央倉庫的一個備份,可以使用戶就近訪問
? ?? ?? ?? ?? ?? ?局域網(wǎng):我們自己搭建的一個maven倉庫,比如一個公司內(nèi)部自己搭建一個私服作為自己的倉庫,之前積累了很多公共的功能包,就可以放在這個倉庫中,有新項目的時候就可以直接從這里獲取一些基礎(chǔ)的依賴。

小結(jié):

? ?? ?? ?maven本身其實就是一個工具,常用的東西也不多,但是因為剛?cè)胄械臅r候沒有好好學(xué)習(xí),直接用springBoot上手開發(fā)項目,做簡單的項目倒沒什么影響。但是在一個大公司內(nèi)部,之前已經(jīng)開發(fā)了很多東西,新項目也都是在之前的基礎(chǔ)上進(jìn)行,對于依賴的管理就很重要的。我也是開始在公司中接觸一個比較復(fù)雜的項目,發(fā)現(xiàn)pom中很多東西自己不理解。所以把這塊東西稍微整理下,之后開發(fā)的時候面對項目復(fù)雜的結(jié)構(gòu),多想想這塊的東西,相信會有更多的收獲吧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容