Maven

1.Maven是啥:
Maven的是阿帕奇基金會軟件維護唯一一款的自動化構建工具,專注於服務的Java的平臺個人文庫項目構建狀語從句:依賴管理
行家是基於項目對象模型(POM),可以通過一小段描述信息來管理項目的構建,報告和文檔的軟件項目管理工具。

2.Maven可以幹啥:
  • 添加第三方罐包;
  • 罐子包之間的依賴關係;
  • 將項目拆分成多個工程模塊

3.構建項目的幾個主要環節:   
  • 清理:刪除以前的編譯結果,爲重新編譯做好準備。
  • 編譯:將Java源程序編譯爲字節碼文件。
  • 測試:針對項目中的關鍵點進行測試,確保項目在迭代開發過程中關鍵點的正確性
  • 報告:在每一次測試後以標準的格式記錄和展示測試結果
  • 打包:將一個包含諸多文件的工程封裝爲一個壓縮文件用於安裝或部署.Java工程對應jar包,Web工程對應war包。 
  • 安裝:在Maven環境下特指將打包的結果 - jar包或war包安裝到本地倉庫中。
  • 部署:將打包的結果部署到遠程倉庫或將戰包部署到服務器上運行。

4.Maven常用命令
mvn -version / -v      顯示版本信息
 mvn clean                清空生成的文件

mvn編譯             編譯 

mvn test                    編譯並測試 

mvn package            生成目標,編譯,測試代碼,生成測試報告,生成jar / war文件 

mvn網站                    生成項目相關信息的網站 

mvn site-deploy生成站點目錄併發布

mvn eclipse:eclipse將項目轉化爲Eclipse項目

mvn archetype:生成創建mvn項目 
mvn archetype:create -DgroupId = com.oreilly -DartifactId = my-app創建mvn項目


5.Maven核心
Maven核心概念Maven能夠實現自動化構建是和它的內部原理分不開的,這裏我們從Maven的九個核心概念入手,看看Maven是如何實現自動化構建的 
  • POM 
  • 約定的目錄結構
  • 座標
  • 依賴管理
  • 倉庫管理 
  • 生命週期 
  • 插件和目標 
  • 繼承 
  • 聚合 

Maven的核心程序僅僅定義了抽象的生命週期,而具體的操作則是由Maven的插件來完成的。可是Maven的插件並不包含在Maven的核心程序中,在首次使用時需要聯網下載。下載得到的插件會被保存到本地倉庫中本地倉庫默認的位置是:〜\ .m2目錄下\庫。 


6.Maven約定的工程目錄:




7.POM
Project Object Model:項目對象模型。將Java工程的相關信息封裝爲對象作爲便於操作和管理的模型。 
Maven工程的核心配置。可以說學習Maven就是學習pom.xml文件中的配置。 

8.座標
  • Maven的座標使用如下三個向量在Maven的倉庫中唯一的確定一個Maven工程。 
    • groupid:公司或組織的域名倒序+當前項目名稱 
    • <groupId>com.example</groupId>
    • artifactId:當前項目的模塊名稱 
    • <artifactId>demo</artifactId>
    • version:當前模塊的版本
    • <version>0.0.1-SNAPSHOT</version>
  •  如何通過座標到倉庫中查找jar包?
    • 將gav三個向量連起來  
                 com.atguigu.maven +你好+ 0.0.1-SNAPSHOT
    • 以連起來的字符串作爲目錄結構到倉庫中查找 
                COM / atguigu /行家/你好/ 0.0.1-SNAPSHOT / HELLO-0.0.1-SNAPSHOT.jar
 ※注意:我們自己的Maven工程必須執行安裝操作纔會進入倉庫。安裝的命令是:mvn install


9.依賴
Maven中最關鍵的部分,我們使用Maven最主要的就是使用它的依賴管理功能。要理解和掌握Maven的依賴管理,我們只需要解決一下幾個問題: 

①依賴的目的是什麼 
當A jar包用到了B jar包中的某些類時,A就對B產生了依賴,這是概念上的描述。那麼如何在項目中以依賴的方式引入一個我們需要的jar包呢?答案非常簡單,就是使用依賴標籤指定被依賴jar包的座標就可以了。  
        <依賴性>
            <的groupId> com.atguigu.maven </的groupId>
            <artifactId的>你好</ artifactId的>
            <版本> 0.0.1-SNAPSHOT </版本>
            <範圍>編譯</範圍>            
        </依賴性>

②依賴的範圍 
大家注意到上面的依賴信息中除了目標jar包的座標還有一個scope設置,這是依賴的範圍。依賴的範圍有幾個可選值,我們用得到的是:compile,test,provided 三個,當然還有不常用的運行時間,sysstem ..
  • 編譯:默認範圍,編譯測試運行都有效
  • 提供:在編譯和測試時有效
  • 運行時間:在測試和運行時有效
  • 測試:只在測試時有效
  • 系統:在編譯和測試時有效,與本機系統關聯,可移植性差

  • 常用依賴範圍有效性總結 


③依賴的傳遞性 
A依賴B,B依賴C,A能否使用C呢?那要看B依賴C的範圍是不是compile,如果是可用,否則不可用。 


④依賴的排除 
如果我們在當前工程中引入了一個依賴是A,而A又依賴了B,那麼Maven會自動將A依賴的B引入當前工程,但是個別情況下B有可能是一個不穩定版,或對當前工程有不良影響。這時我們可以在引入A的時候將B排除。 
<依賴性>
            <的groupId> com.atguigu.maven </的groupId>
            <artifactId的>你好</ artifactId的>
            <版本> 0.0.1-SNAPSHOT </版本>
            <範圍>編譯</範圍>
            <排除>
                <排除>
                    <的groupId>共享記錄</的groupId>
                    <artifactId的>共享記錄</ artifactId的>
                </排除>
            </排除>
        </依賴性>

⑤統一管理所依賴jar包的版本對同一個框架的一組jar包最好使用相同的版本。爲了方便升級框架,可以將jar包的版本信息統一提取出來 
  • 統一聲明版本號 
    <性能>
        <atguigu.spring.version> 4.1.1.RELEASE </atguigu.spring.version>
        <project.build.sourceEncoding> UTF-8 </project.build.sourceEncoding>
    </屬性>

  • 引用前面聲明的版本號
        <依賴性>
            <的groupId> org.springframework </的groupId>
            <artifactId的>彈簧芯</ artifactId的>
            <版本> $ {atguigu.spring.version} </版本>
            <範圍>編譯</範圍>
        </依賴性>

⑥依賴的原則:解決jar包衝突 
  • 路徑最短者優先 
  • 路徑相同時先聲明者優先 


10.倉庫
  •  分類 
    • 本地倉庫:爲當前本機電腦上的所有Maven工程服務。 
    • 遠程倉庫 
      1. 私服:架設在當前局域網環境下,爲當前局域網範圍內的所有Maven工程服務。 
      2. 中央倉庫:架設在Internet上,爲全世界所有Maven工程服務。
      3. 中央倉庫的鏡像:架設在各個大洲,爲中央倉庫分擔流量減輕中央倉庫的壓力,同時更快的響應用戶請求。 
  • 倉庫中的文件
    • Maven的插件
    • 我們自己開發的項目的模塊
    • 第三方框架或工具的jar包
 ※不管是什麼樣的jar包,在倉庫中都是按照座標生成目錄結構,所以可以通過統一的方式查詢或依賴。 


11.生命週期
  1. 什麼是Maven的生命週期?
 Maven生命週期定義了各個構建環節的執行順序,有了這個清單,Maven就可以自動化的執行構建命令了
 。Maven有三套相互獨立的生命週期,分別是: 
  • 清潔生命週期在進行真正的構建之前進行一些清理工作。 
  • 默認生命週期構建的核心部分,編譯,測試,打包,安裝,部署等等。
  • 網站生命週期生成項目報告,站點,發佈站點。 
它們是相互獨立的,你可以僅僅調用clean來清理工作目錄,僅僅調用網站來生成站點。當然你也可以直接運行mvn clean install site運行所有這三套生命週期。每套生命週期都由一組階段(階段)組成,我們平時在命令行輸入的命令總會對應於一個特定的階段。比如,運行mvn clean,這個clean是乾淨的生命週期的一個階段。有乾淨的生命週期,也有乾淨的階段。 

  • 清潔生命週期 
清潔生命週期一共包含了三個階段: 
①pre-clean執行一些需要在乾淨之前完成的工作 
②clean移除所有上一次構建生成的文件
③post-clean執行一些需要在乾淨之後立刻完成的工作 

  • 網站生命週期 
①現場執行一些需要在生成站點文檔之前完成的工作 
② 
現場執行一些需要在生成站點文件之後完成的工作,並且爲部署做準備 
④現場部署將生成的站點文件部署到Maven站點,這可是Maven相當強大的功能,經理比較喜歡,文檔和統計數據自動生成,很好看。

  • 默認生命週期
 默認生命週期是Maven生命週期中最重要的一個,絕大部分工作都發生在這個生命週期中。

  • 生命週期與自動化構建 
運行任何一個階段的時候,它前面的所有階段都會被運行,例如我們運行mvn install的時候,代碼會被編譯,測試,打包。這就是Maven爲什麼能夠自動執行構建過程的各個環節的原因。 Maven的插件機制是完全依賴Maven的生命週期的,因此理解生命週期至關重要。


12.插件和目標
●Maven的核心僅僅定義了抽象的生命週期,具體的任務都是交由插件完成的。 
●每個插件都能實現多個功能,每個功能就是一個插件目標。 
●Maven的生命週期與插件目標相互綁定,以完成某個具體的構建任務。
 例如:編譯就是插件maven-compiler-plugin的一個目標; pre-clean是插件maven-clean-plugin的一個目標。 


13.繼承
  • 爲什麼需要繼承機制? 
由於非編譯範圍的依賴信息是不能在“依賴鏈”中傳遞的,所以有需要的工程只能單獨配置。
  • 創建父工程創建父工程和創建一般的Java工程操作一致,唯一需要注意的是:打包方式處理要設置爲pom。 
  • 在子工程中引用父工程.........從當前目錄到父項目的pom.xml文件的相對路徑
        <母體>
            <groupId>com.atguigu.maven</groupId>
            <artifactId>Parent</artifactId>
            <version>0.0.1-SNAPSHOT</version>

            <!-- 以當前文件爲基準的父工程pom.xml文件的相對路徑 -->
            <relativePath>../Parent/pom.xml</relativePath>
        </parent>
此時如果子工程的 groupId 和 version 如果和父工程重複則可以刪除。 
  • 在父工程中管理依賴 將 Parent 項目中的 dependencies 標籤,用 dependencyManagement 標籤括起來
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <版本> 4.9 </版本>
                    <範圍>測試</範圍>
                </依賴性>
            </依賴>
        </ dependencyManagement>

在子項目中重新指定需要的依賴,刪除範圍和版本號
        <依賴性>
            <的groupId>的junit </的groupId>
            <artifactId的>的junit </ artifactId的>
        </依賴性>


14.聚合
  • 爲什麼要使用聚合? 
將多個工程拆分爲模塊後,需要手動逐個安裝到倉庫後依賴才能夠生效。修改源碼後也需要逐個手動進行清理操作而使用了聚合之後就可以批量進行Maven的工程的安裝,清理工作。 12.2如何配置聚合?在總的聚合工程中使用modules / module標籤組合,指定模塊工程的相對路徑即可 
    <! - 配置聚合 - >
        <模塊>
            <! - 指定各個子工程的相對路徑 - >
            <模塊> ../ HelloFriend </模塊>
            <模塊> ../ MakeFriends </模塊>
            <模塊> ../你好</模塊>
        </模塊>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章