01_自動化構建工具之Maven

  • 目前技術中存在問題(爲何使用Maven):
    1. 一個項目就是一個工程:
      1. 缺陷:若是項目太過龐大,就不適合使用package來劃分層次,最好是一個模塊就是一個工程,利於分工協做。
      2. 解決:Maven能夠將一個項目拆分紅多個工程。
    2. 項目中所須要的jar包必須手動「複製」「粘貼」到WEB-INF/lib中:
      1. 缺陷:一樣的jar包出如今不一樣的工程中,形成磁盤存儲空間的浪費,同時形成工程臃腫。
      2. 決:藉助Maven能夠將jar包保存在倉庫中,而後在項目中添加一個「引用」文件接口便可。
    3. jar包須要提早下載好,或者別人事先準備好:
      1. 缺陷:不一樣的官網提供jar包下載的方式不一樣,經過非官網下載則可能致使jar包不規範(收費、版本)。
      2. 解決:全部的jar包都在Mven的中央倉庫中存儲,可使用規範的方式下載所須要的jar包。
    4. jar包須要手動添加依賴包
      1. 缺陷:jar包之間具備依賴性,如commons-filedupload.jar包依賴於commons-io.jar包,在使用這些jar包時,必需要                            掌握其中的依賴關係。
      2. 解決:使用maven,會自動將依賴包導入到項目中。
  • Maven是什麼:
    • ①.Maven是一款只針對Java平臺的自動化構建工具
      1. 發展歷程:Make→Ant→Maven→Gradle
    •  ②. 構建
      1. 概念:以「Java源文件」「框架配置文件」「jsp」「html」「圖片」等資源文件爲「原材料」,去「生產」一個能夠            運行的項目的過程。
      2. 編譯:Java源文件→編譯→Class字節碼文件→交給JVM去執行       。
      3. 部署:一個動態web項目最終運行的並非項目自己,而是這個項目「編譯的結果」。
      4. 構建:構建並不等於建立,構建就是以咱們編寫的Java文件、框架配置文件、國際化等資源文件、圖片和jsp頁面等             靜態資源做爲「原材料」,生產出一個可運行的項目的過程。
    • ③.構建過程當中的各個環節:
      1. 清理:將之前編譯獲得的舊的class字節碼文件刪除
      2. 編譯:將Java文件編譯爲class字節碼文件
      3. 測試:自動測試,自動調用JUnit程序
      4. 報告:將測試的結果打印出來
      5. 打包:動態Web工程打包爲war,Java工程打包爲jar
      6. 安裝:Maven特定概念--將打包獲得的文件複製到「倉庫」指定位置
      7. 部署:將動態web工程打包而成的war包複製到servlet容器的指定目錄下。               
  • Maven環境配置:
    1. Java環境變量配置
    2. 解壓縮Maven壓縮文件,並建立一個新的目錄進行存放
    3. 配置Maven環境:
    1. 配置MAVEN_HOMT或M2_HOME:
    2. 配置Maven的path環境:
    3. 驗證Maven安裝是否成功:mvn -v,顯示當前版本信息後則安裝成功
  • Maven的核心概念:
  1. 約定的目錄結構
  2. POM
  3. 座標
  4. 依賴
  5. 倉庫
  6. 生命週期/插件/目標
  7. 繼承
  8. 聚合
  • .第一個Maven工程:
    • 建立約定的目錄結構:
    1. 根目錄:工程名
    2. src目錄:源碼
    3. POM.xml文件:Maven工程的核心配置文件
    4. main目錄:存放主程序        
    5. test目錄:存放測試程序
    6. java目錄:存放Java源文件
    7. resources目錄:存放框架或者其餘工具的配置文件
    • 爲何要遵照約定的目錄結構?
    1. 爲了自動化構建
  • 經常使用命令:
    • 注意:執行與構建過程相關的maven命令,必須進入pom.xml所在目錄。與構建過程相關:編譯、測試、打包......
    • 經常使用命令:
      1. mvn clean:清理
      2. mvn compile:編譯主程序
      3. mvn test-compile:編譯測試程序
      4. mvn test:執行測試
      5. mvn package:打包    
      6. mvn install:安裝
      7. mvn site:生成站點
  • 關於Maven聯網問題:
    • Maven的核心程序中僅僅定義了抽象的生命週期,可是具體的工做必須由特定的插件來完成。而插件自己並不包含在Maven的核心程序
    • 當咱們使用的Maven命令須要用到一些別的插件時,Maven核心程序會先到電腦本地的倉庫中尋找
    • 本地倉庫的默認位置爲(c:\users\Administor\.m2\repository)    
    • Maven若是在本地倉庫沒法找到須要的插件,會自動鏈接外網在中央倉庫中下載
    • 若是沒法聯網,則構建會失敗
    • 修改默認本地倉庫位置,可讓Maven核心程序到事先準備好的目錄下尋找插件
      1. Maven解壓目錄\conf\setting.xml
      2. 在setting.xml中找到ocalRepository標籤
      3. 將<localRepository>/path/to/local/repo</localRepository>
      4. 將標籤中間的路徑修改成早已準備好的maven倉庫目錄
      5. <localRepository>D:\Work\Environment\Maven\local</localRepository>
  • POM文件
    • 全拼:Project Object Model 項目對象模型
      • Dom :Document Object Model 文檔對象模型
    • pom.xml文件是Maven的核心配置文件,與構建過程相關的一切設置都這pom.xml中進行
  • 座標:
    • 數學中的座標:
      1. 在平面中,使用x、y兩個向量,能夠在平面中肯定惟一的一個點
      2. 在空間中,使用x、y、z三個向量能夠在空間中肯定惟一的一個點    
    • 在Maven中使用如下三個向量來肯定惟一的Maven工程
      1. groupId:公司/組織域名倒序+項目名
        • <groupId>pw.fengya.maven</groupId>
      2. artifactId:模塊名
        • <artifactId>Hello</artifactId>
      3. version:版本
        • <version>1.0.0</version>
    • 座標與倉庫中的路徑的對應關係       
  • 倉庫
    1. 倉庫分類:
      • 本地倉庫:在當前電腦上部署的Maven倉庫目錄,只爲當前電腦的Maven工程服務
      • 遠程倉庫:
      1. 私服(Nexus):架設在局域網環境下,爲當前局域網環境下的Maven工程服務
      2. 中央倉庫:架設在Internet上,爲全世界的Maven工程服務
      3. 中央倉庫鏡像:爲了分擔中央倉庫的流量壓力,提高用戶訪問速度
    2. 倉庫中保存內容(Maven工程):
      • Maven自身所須要的插件
      • 第三方框架或工具所需jar包
      • 本身開發的Maven工程
  • 依賴
  • Maven解析依賴信息時會到本地倉庫中尋找被依賴的jar包
    • 對於咱們本身開發的Maven工程,使用mvn install命令後就能夠進入倉庫
  • 依賴的取值:
    • compile範圍依賴
      • 對主程序是否有效:有效
      • 對測試程序是否有效有效
      • 是否參與打包:參與
    • test
      • 對主程序是否有效:無效
      • 對測試程序是否有效:有效
      • 是否參與打包:不參與
      • eg:junit.jar
    • provided:                 
    • 對主程序是否有效:有效
    • 對測試程序是否有效:有效
    • 是否參與打包:不參與
    • 是否參與部署:不參與
    • eg:servlet-api.jar
  • Maven生命週期:
    • 各個構建環節執行的順序:不能打亂順序,必須按照既定的正確順序來執行
    • Maven的核心程序中定義了抽象的生命週期,生命週期各個階段的具體任務由插件來完成
    • Maven核心程序爲了更好的實行自動化構建,按照這些特色來執行生命週期中的各個階段:不論如今要執行生命週期中的哪個階段,都是從這個生命週期的最初開始執行。
  • 在Eclipse中使用Maven插件
    • Maven插件:Eclipse內置
    • Maven插件設置:
      • 在installation中添加本身本地的Maven倉庫目錄
      • 在user setting中設置conf/setting.xml的位置
    • 建立Maven工程:
      • 建立Java工程,選擇打包方式爲jar
      • 建立web工程,選擇打包方式爲war,並選中項目,選擇properties,選擇Project Facets,去掉Dynmic  web Module,點擊Apply,從新勾選,並勾選在src/main/webapp目錄下建立web.xml        
    • jsp頁面拋空指針異常,則多是依賴範圍問題,將socpe屬性值改成provided
  • 依賴[高級]:
    • 依賴的傳遞性:
      • 好處:能夠傳遞的依賴沒必要再每一個模塊都進行聲明,在「最下面」的工程中依賴一次便可
      • 注意:只有compile範圍的依賴能夠進行傳遞
    • 依賴的排除:
      • 在某個項目中確實須要依賴某jar包,而其傳遞的依賴中可能有jar包並不穩定,因此須要排除
      • 排除設置:
      • <exclusions>
                <exclusion>
                          <groupId></groupId>
                           <artifactId></artifactId>
                </exclusion>
        </exclusions>
  • 依賴的原則:
    • 做用:解決模塊jar包之間的衝突性問題
    • 情景設定1:聲明路徑不一樣時,路徑較短者優先
    • 情景設定2:聲明路徑相同時,先聲明者優先
      • 此處路徑相同指的是dependency標籤的前後順序
  • 依賴版本管理:
    • 情景設定:加入當前項目使用的spring版本爲4.0.0,假如後期須要修改版本號爲4.0.2時,不可能依靠手動修改
      • 解決方案:在properties標籤中使用自定自定義標籤統一聲明版本號        
      • <properties>
                <自定義標籤名>版本號</自定義標籤名>
        </properties>
    • 在須要同一版本的位置,使用${自定義標籤名}聲明引用的版本號
    • 使用properties標籤和自定義標籤的方式並非只適合於版本號的設定,也能夠用於其餘地方,相似於Java中的常量
  • 繼承:
    • 現狀:
      • JavaProject01依賴的Junit版本:4.0
      • JavaProject02依賴的Junit版本:4.0
      • JavaProject03依賴的Junit版本:4.9
      • 缺陷:因爲test範圍的依賴不能傳遞,因此必然會致使各模塊版本不一致            
    • 需求:統一管理各個模塊對於Junit的版本管理
    • 解決思路:將Junit統一提取到「父」工程中,在子工程中聲明Junit依賴時不指定版本,以父工程統一設定爲準,也利於修改。
    • 操做步驟:
      • 建立一個Maven工程爲父工程,注意:打包方式爲pom
                  
  • 在子工程中聲明對父工程的引用
  • 將子工程中與父工程衝突的部分刪掉
  • 在父工程中統一對Junit的依賴
  • 在子工程中刪除對於Junit依賴的版本號      
     
  • 配置完成後,須要先安裝父工程再安裝子工程
  • 聚合:
    • 做用:一鍵自動安裝各個模塊工程
    • 配置方式:在一個「總的聚合工程」中配置參與聚合的各個模塊
    • 使用方式:在聚合工程中run as 選擇Maven install
相關文章
相關標籤/搜索