maven學習整理

1. 什么是maven
  • 翻譯為“專家”,“內行”
  • Maven是跨平臺的項目管理工具。主要服務于基于Java平臺的項目構建,依賴管理和項目信息管理。
  • 什么是理想的項目構建?
     高度自動化,跨平臺,可重用的組件,標準化的
  • 什么是依賴?為什么要進行依賴管理?
     自動下載,統(tǒng)一依賴管理
  • 有哪些項目信息?
     項目名稱描述等,開發(fā)人員信息,開發(fā)者信息等
  • 約定優(yōu)于配置(convention over configuration)
2. 什么是構建
構建流程
3. mavne模型
maven模型
4. mavne的主要特點
  • 擁有約定,知道你的代碼在哪里,放到哪里去
  • 擁有一個生命周期,例如執(zhí)行 mvn install 就可以自動執(zhí)行編譯,測試,打包等構建過程
  • 只需要定義一個pom.xml,然后把源碼放到默認的目錄,Maven幫你處理其他事情
  • 擁有依賴管理,倉庫管理
5. maven安裝
  1. jdk安裝(根據(jù)maven版本選擇符合條件的jdk版本)
  2. 下載maven, 加壓下載文件, 配置MAVEN_HOME即可使用(類似jdk配置).
  3. maven目錄介紹


    maven解壓目錄

bin:含有mvn運行的腳本
boot:含有plexus-classworlds類加載器框架
conf:含有settings.xml配置文件
lib:含有Maven運行時所需要的java類庫
LICENSE.txt, NOTICE.txt, README.txt針對Maven版本,第三方軟件等簡要介紹

6. maven初始配置
  • 設置MAVEN_HOME環(huán)境變量
     升級時只需要下載最新版本,解壓縮后重新設置MAVEN_HOME環(huán)境變量即可
  • 設置MAVEN_OPTS環(huán)境變量
     -Xms128m -Xmx512m
  • 配置用戶范圍的settings.xml
     MAVEN_HOME/conf/settings.xml 全局的
     ~/.m2/settings.xml
     ?。J倉庫:當前用戶路徑C:\Users[UserName].m2
     ?。璴ocalRepository:用戶倉庫,用于檢索依賴包路徑
  • 用戶Maven依賴包路徑層次目錄
    依賴包路徑層次目錄

    ?。璼ettings.xml文件必須與maven安裝路徑下的內容保持一致
     -settings.xml文件中設置路徑指向設定的倉庫目錄
    <localRepository>D:\maven\repository</localRepository>
    ?。驗閙aven的中心倉庫在國外,下載會很慢, 建議使用阿里云的maven倉庫-配置方式
     注意
      用戶級別的倉庫在全局配置中一旦設置,全局配置將不再生效,轉用用戶所設置的倉庫,否則使用默認路徑倉庫.
7. maven項目約定
  • src/main/java —— 存放項目的.java文件
  • src/main/resources —— 存放項目資源文件,如spring, mybatis等配置文件
  • src/test/java —— 存放所有測試.java文件,如JUnit測試類
  • src/test/resources —— 測試資源文件
  • target —— 項目輸出位置
  • pom.xml——maven項目核心配置文件
8. maven核心概念

1.maven坐標

  • 什么是坐標?
     在平面幾何中坐標(x,y)可以標識平面中唯一的一點
  • Maven坐標主要組成
     groupId:定義當前Maven項目隸屬項目, 一般為公司域名反寫(com.taobao)
     artifactId:定義實際項目中的一個模塊(testMaven)
     version:定義當前項目的當前版本(1.1.0)
     packaging:定義該項目的打包方式(jar,war,maven)
  • Maven為什么使用坐標?
     -Maven世界擁有大量構建,我們需要找一個用來唯一標識一個構建的統(tǒng)一規(guī)范
    ?。瓝碛辛私y(tǒng)一規(guī)范,就可以把查找工作交給機器
    2.依賴管理-依賴范圍

    2-1.傳遞性依賴
     其中依賴范圍scope用來控制依賴和編譯,測試,運行的classpath的關系. 主要的是三種依賴關系如下:
     1.compile: 默認編譯依賴范圍。對于編譯,測試,運行三種classpath都有效
     2.test:測試依賴范圍。只對于測試classpath有效
     3.provided:已提供依賴范圍。對于編譯,測試的classpath都有效,但對于運行無效。因為由容器已經提供,例如servlet-api.
     4.runtime:運行時提供。面向接口編程時, 在編譯時期不需要知道具體的實現(xiàn)是誰, 所以編譯階段可以不需要具體的實現(xiàn)出現(xiàn), 例如:jdbc驅動.
     5.system 本地一些jar 例如短信jar

2-1-1.依賴管理-依賴范圍對傳遞依賴的影響:

列是第一直接依賴,行是第二間接依賴

2-2.可選依賴
<optional> true/false 是否向下傳遞
2-3.排除依賴
<exclusions>
 <exclusion>
   所包含坐標
 排除依賴包中所包含的依賴關系
 不需要添加版本,直接類別排除
3.依賴沖突
 如果直接與間接依賴中包含有同一個坐標不同版本的資源依賴,以直接依賴的版本為準(就近[最短路徑]原則)
 如果直接依賴中包含有同一個坐標不同版本的資源依賴,以配置順序下方的版本為準(加載先后原則)

9. 生命周期
  1. 何為生命周期?
    ?。璏aven生命周期就是為了對所有的構建過程進行抽象和統(tǒng)一
     -包括項目清理,初始化,編譯,打包,測試,部署等幾乎所有構建步驟
  2. Maven有三套相互獨立的生命周期,請注意這里說的是“三套”,而且“相互獨立”,這三套生命周期分別是
    Clean Lifecycle(清理項目): 在進行真正的構建之前進行一些清理工作。
    Default Lifecycle(構建項目): 構建的核心部分,編譯,測試,打包,部署等等。
    Site Lifecycle: 生成項目報告,站點,發(fā)布站點。
     再次強調一下它們是相互獨立的,你可以僅僅調用clean來清理工作目錄,僅僅調用site來生成站點。當然你也可以直接運行 mvn clean install site 運行所有這三套生命周期。
     A Build Lifecycle is Made Up of Phases
     A Build Phase is Made Up of Plugin Goals

2.1 clean生命周期:
 clean生命周期每套生命周期都由一組階段(Phase)組成,我們平時在命令行輸入的命令總會對應于一個特定的階段。比如,運行mvn clean ,這個的clean是Clean生命周期的一個階段。有Clean生命周期,也有clean階段。Clean生命周期一共包含了三個階段:
 pre-clean 執(zhí)行一些需要在clean之前完成的工作
 clean 移除所有上一次構建生成的文件(target文件)
 post-clean 執(zhí)行一些需要在clean之后立刻完成的工作
 mvn clean 中的clean就是上面的clean,在一個生命周期中,運行某個階段的時候,它之前的所有階段都會被運行,也就是說,mvn clean 等同于 mvn pre-clean clean,如果我們運行 mvn post-clean ,那么 pre-clean,clean 都會被運行。這是Maven很重要的一個規(guī)則,可以大大簡化命令行的輸入。
2.1 default生命周期:
 default生命周期是Maven生命周期中最重要的一個,絕大部分工作都發(fā)生在這個生命周期中。這里,只解釋一些比較重要和常用的階段:
 validate
 generate-sources
 process-sources
 generate-resources
 process-resources 復制并處理資源文件,至目標目錄,準備打包。
 compile 編譯項目的源代碼。
 process-classes
 generate-test-sources
 process-test-sources
 generate-test-resources
 process-test-resources 復制并處理資源文件,至目標測試目錄。
 test-compile 編譯測試源代碼。
 process-test-classes
 test 使用合適的單元測試框架運行測試。這些測試代碼不會被打包或部署。
 prepare-package
 package 接受編譯好的代碼,打包成可發(fā)布的格式,如 JAR 。
 pre-integration-test
 integration-test
 post-integration-test
 verify
 install 將包安裝至本地倉庫,以讓其它項目依賴。
 deploy 將最終的包復制到遠程的倉庫,以讓其它開發(fā)人員與項目共享。
 運行任何一個階段的時候,它前面的所有階段都會被運行,這也就是為什么我們運行mvn install 的時候,代碼會被編譯,測試,打包。此外,Maven的插件機制是完全依賴Maven的生命周期的,因此理解生命周期至關重要。
2.2 site生命周期:
 pre-site 執(zhí)行一些需要在生成站點文檔之前完成的工作
 site 生成項目的站點文檔
 post-site 執(zhí)行一些需要在生成站點文檔之后完成的工作,并且為部署做準備
 site-deploy 將生成的站點文檔部署到特定的服務器上
 這里經常用到的是site階段和site-deploy階段,用以生成和發(fā)布Maven站點,這可是Maven相當強大的功能,Manager比較喜歡,文檔及統(tǒng)計數(shù)據(jù)自動生成,很好看。

生命周期圖例

  1. 常用命令:
    a) compile
    b) clean 刪除target/
    c) test test case junit/testNG
    d) package 打包
      mvn clean package -U (強制拉一次)
    e) install 把項目install到local repo
    f) deploy 發(fā)本地jar發(fā)布到remote
10. 插件
  • Maven的核心僅僅定義了抽象的生命周期,具體的任務都是交由插件完成的.
  • 每個插件都能實現(xiàn)多個功能,每個功能就是一個插件目標
  • Maven的生命周期與插件目標相互綁定,以完成某個具體的構建任務
    例如compile就是插件maven-compiler-plugin的一個插件目標
<build>
    <plugins>
        <plugin>
                <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>2.2.1</version>
            <executions>
                        <execution>
                    <goals>
                        <goal>jar-no-fork</goal>
                            </goals>
                        <phase>verify</phase>
                </execution>
                </executions>
        </plugin>
    </plugins>
</build>
11. 繼承
  • 何為繼承?
     繼承為了消除重復,我們把很多相同的配置提取出來
    例如:grouptId,version等
    父工程設置為被繼承: <packaging>pom</packaging>
    子工程繼承父工程:
     省略父工程中定義的坐標除訪問名稱中的所有設定,添加繼承父工程
      <parent>
       <groupId>…</groupId>
       <artifactId>… </artifactId>
       <version>… </version>
       <relativePath>../父工程項目名</relativePath>
      </parent>
  • 父工程統(tǒng)一管理子工程依賴版本
     <dependencyManagement>
       <dependencies>
        //添加公共依賴包
       </dependencies>
     </dependencyManagement>
     1.只能出現(xiàn)在父pom
     2.子工程僅僅添加依賴包,無需添加版本,版本由父工程繼承而來
     3.為了進一步便于管理,將所有的版本管理設置在一起,設置為系統(tǒng)屬性值:
     <properties>
      <junit.version>4.9</junit.version>
      ……
     </properties>
    引用使用${junit.version}格式進行,只能在依賴范圍設置
  • 父工程統(tǒng)一管理子工程依賴關系
    如果所有子工程都需要依賴某些包,父工程可以通過設置依賴,將依賴關系傳遞到子工程中:
     <dependencies>
      //添加公共依賴包
     </dependencies>
  • 總結:
    1.dependencyManagement中定義的依賴子module不會共享
    2.dependencies中定義的依賴子module可以共享
12. 聚合
  • 何為聚合?
     如果我們想一次構建多個項目模塊,那我們就需要對多個項目模塊進行聚合
     <modules>
      <module>../子項目名稱1</module>
      <module>../子項目名稱2</module>
       <module>../子項目名稱3</module>
     </modules>
  • 聚合與繼承的關系
    ?。?strong>聚合主要為了快速構建項目
     -繼承主要為了消除重復
13. archetype模塊化

a) 生成一個archetype
  i. mvn archetype:create-from-project
  ii. cd /target/generated-sources/archetype
  iii. mvn install
 b) 從archetype創(chuàng)建項目 mvn archetype:generate -DarchetypeCatalog=local

14. 倉庫管理
  • 何為Maven倉庫?
     用來統(tǒng)一存儲所有Maven共享構建的位置就是倉庫
  • Maven倉庫布局
     -根據(jù)Maven坐標定義每個構建在倉庫中唯一存儲路徑
    ?。笾聻椋篻roupId/artifactId/version/artifactId-version.packaging
  • 倉庫的分類
    ?。镜貍}庫:
       ~/.m2/repository/
       每個用戶只有一個本地倉庫
    ?。h程倉庫
       中央倉庫:Maven默認的遠程倉庫,不包含版權資源.
       私服[Nexus]:是一種特殊的遠程倉庫,它是架設在局域網內的倉庫
15. maven 排查命令

1. 查看項目maven依賴樹: mvn dependency:tree > a.txt
2. 查看系統(tǒng)變量: mvn help:system

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

相關閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,699評論 19 139
  • 當前,JVM生態(tài)圈主要的三大構建工具: Apache Ant(帶著Ivy) Maven Gradle 對于剛開始接...
    清楓_小天閱讀 5,996評論 1 13
  • maven maven是一個跨平臺的項目管理的工具。隸屬于Apache下的一個開源項目。主要服務于Java平臺的項...
    jwfy閱讀 1,084評論 0 2
  • 所有項目的構建都是有生命周期的,這個生命周期包括:項目清理、初始化、編譯、測試、打包、集成測試、驗證、部署、站點生...
    zlcook閱讀 3,019評論 0 21
  • 寶貝,你再也不要靠他了
    放牛的小孩閱讀 190評論 0 0

友情鏈接更多精彩內容