maven學習整理

1. 什么是maven
  • 翻譯為“專家”,“內行”
  • Maven是跨平臺的項目管理工具。主要服務于基于Java平臺的項目構建依賴管理和項目信息管理。
  • 什么是理想的項目構建?
     高度自動化,跨平臺,可重用的組件,標準化的
  • 什么是依賴?為什么要進行依賴管理?
     自動下載,統一依賴管理
  • 有哪些項目信息?
     項目名稱描述等,開發人員信息,開發者信息等
  • 約定優于配置(convention over configuration)
2. 什么是構建
構建流程
3. mavne模型
maven模型
4. mavne的主要特點
  • 擁有約定,知道你的代碼在哪里,放到哪里去
  • 擁有一個生命周期,例如執行 mvn install 就可以自動執行編譯,測試,打包等構建過程
  • 只需要定義一個pom.xml,然后把源碼放到默認的目錄,Maven幫你處理其他事情
  • 擁有依賴管理,倉庫管理
5. maven安裝
  1. jdk安裝(根據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環境變量
     升級時只需要下載最新版本,解壓縮后重新設置MAVEN_HOME環境變量即可
  • 設置MAVEN_OPTS環境變量
     -Xms128m -Xmx512m
  • 配置用戶范圍的settings.xml
     MAVEN_HOME/conf/settings.xml 全局的
     ~/.m2/settings.xml
      -默認倉庫:當前用戶路徑C:\Users[UserName].m2
      -localRepository:用戶倉庫,用于檢索依賴包路徑
  • 用戶Maven依賴包路徑層次目錄
    依賴包路徑層次目錄

     -settings.xml文件必須與maven安裝路徑下的內容保持一致
     -settings.xml文件中設置路徑指向設定的倉庫目錄
    <localRepository>D:\maven\repository</localRepository>
     -因為maven的中心倉庫在國外,下載會很慢, 建議使用阿里云的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世界擁有大量構建,我們需要找一個用來唯一標識一個構建的統一規范
     -擁有了統一規范,就可以把查找工作交給機器
    2.依賴管理-依賴范圍

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

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

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

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

9. 生命周期
  1. 何為生命周期?
     -Maven生命周期就是為了對所有的構建過程進行抽象和統一
     -包括項目清理,初始化,編譯,打包,測試,部署等幾乎所有構建步驟
  2. Maven有三套相互獨立的生命周期,請注意這里說的是“三套”,而且“相互獨立”,這三套生命周期分別是
    Clean Lifecycle(清理項目): 在進行真正的構建之前進行一些清理工作
    Default Lifecycle(構建項目): 構建的核心部分,編譯,測試,打包,部署等等。
    Site Lifecycle: 生成項目報告,站點,發布站點。
     再次強調一下它們是相互獨立的,你可以僅僅調用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 執行一些需要在clean之前完成的工作
 clean 移除所有上一次構建生成的文件(target文件)
 post-clean 執行一些需要在clean之后立刻完成的工作
 mvn clean 中的clean就是上面的clean,在一個生命周期中,運行某個階段的時候,它之前的所有階段都會被運行,也就是說,mvn clean 等同于 mvn pre-clean clean,如果我們運行 mvn post-clean ,那么 pre-clean,clean 都會被運行。這是Maven很重要的一個規則,可以大大簡化命令行的輸入。
2.1 default生命周期:
 default生命周期是Maven生命周期中最重要的一個,絕大部分工作都發生在這個生命周期中。這里,只解釋一些比較重要和常用的階段:
 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 接受編譯好的代碼,打包成可發布的格式,如 JAR 。
 pre-integration-test
 integration-test
 post-integration-test
 verify
 install 將包安裝至本地倉庫,以讓其它項目依賴。
 deploy 將最終的包復制到遠程的倉庫,以讓其它開發人員與項目共享。
 運行任何一個階段的時候,它前面的所有階段都會被運行,這也就是為什么我們運行mvn install 的時候,代碼會被編譯,測試,打包。此外,Maven的插件機制是完全依賴Maven的生命周期的,因此理解生命周期至關重要。
2.2 site生命周期:
 pre-site 執行一些需要在生成站點文檔之前完成的工作
 site 生成項目的站點文檔
 post-site 執行一些需要在生成站點文檔之后完成的工作,并且為部署做準備
 site-deploy 將生成的站點文檔部署到特定的服務器上
 這里經常用到的是site階段和site-deploy階段,用以生成和發布Maven站點,這可是Maven相當強大的功能,Manager比較喜歡,文檔及統計數據自動生成,很好看。

生命周期圖例

  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 發本地jar發布到remote
10. 插件
  • Maven的核心僅僅定義了抽象的生命周期具體的任務都是交由插件完成的.
  • 每個插件都能實現多個功能,每個功能就是一個插件目標
  • 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>
  • 父工程統一管理子工程依賴版本
     <dependencyManagement>
       <dependencies>
        //添加公共依賴包
       </dependencies>
     </dependencyManagement>
     1.只能出現在父pom
     2.子工程僅僅添加依賴包,無需添加版本,版本由父工程繼承而來
     3.為了進一步便于管理,將所有的版本管理設置在一起,設置為系統屬性值:
     <properties>
      <junit.version>4.9</junit.version>
      ……
     </properties>
    引用使用${junit.version}格式進行,只能在依賴范圍設置
  • 父工程統一管理子工程依賴關系
    如果所有子工程都需要依賴某些包,父工程可以通過設置依賴,將依賴關系傳遞到子工程中:
     <dependencies>
      //添加公共依賴包
     </dependencies>
  • 總結:
    1.dependencyManagement中定義的依賴子module不會共享
    2.dependencies中定義的依賴子module可以共享
12. 聚合
  • 何為聚合?
     如果我們想一次構建多個項目模塊,那我們就需要對多個項目模塊進行聚合
     <modules>
      <module>../子項目名稱1</module>
      <module>../子項目名稱2</module>
       <module>../子項目名稱3</module>
     </modules>
  • 聚合與繼承的關系
     -聚合主要為了快速構建項目
     -繼承主要為了消除重復
13. archetype模塊化

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

14. 倉庫管理
  • 何為Maven倉庫?
     用來統一存儲所有Maven共享構建的位置就是倉庫
  • Maven倉庫布局
     -根據Maven坐標定義每個構建在倉庫中唯一存儲路徑
     -大致為:groupId/artifactId/version/artifactId-version.packaging
  • 倉庫的分類
     -本地倉庫:
       ~/.m2/repository/
       每個用戶只有一個本地倉庫
     -遠程倉庫
       中央倉庫:Maven默認的遠程倉庫,不包含版權資源.
       私服[Nexus]:是一種特殊的遠程倉庫,它是架設在局域網內的倉庫
15. maven 排查命令

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,400評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,136評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,714評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,452評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,818評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,997評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,552評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,292評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,510評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,721評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,121評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,429評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,235評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,480評論 2 379

推薦閱讀更多精彩內容

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