跟我1小時搞定Maven是什麼?怎麼用?

    本文原先發表與博客園(http://www.cnblogs.com/libingbin/p/6104588.html ),不過個人博客園已經再也不更新了,原有博文會逐步遷移的。html

 

序言

  聽說半夜喝咖啡敲出來的代碼,有一種淡淡的咖啡味道;那半夜寫出來的總結,是否是也會有一種夜晚的寧靜呢!今晚夜深人靜,就給後生們總結總結Maven吧!畢竟,今天搞J2E的工程師若是不會或不知道Maven,那就在圈子裏尷尬了。Maven是一個採用純Java編寫的開源項目管理工具。Maven採用了一種被稱之爲project object model (POM)概念來管理項目,全部的項目配置信息都被定義在一個叫作POM.xml的文件中,經過該文件,Maven能夠管理項目的整個聲明週期,包括編譯,構建,測試,發佈,報告等等。目前Apache下絕大多數項目都已經採用Maven進行管理。而Maven自己還支持多種插件,能夠方便更靈活的控制項目。一句話:Maven是一個項目管理和構建工具,主要作編譯、測試、報告、打包、部署等操做完成項目的構建。web

基礎概述

  Maven能幹嗎呢?spring

  1.項目自動化編譯部署:apache

  2.項目jar包的依賴管理:api

  3.企業開發分包分模塊部署:框架

 

 

怎樣下載、安裝、配置

  首先,確定是官網看看(https://maven.apache.org)嘍!jsp

  2. 將下載好的maven(壓縮版的)進行解壓/並拷貝本身的開發目錄maven

   3. 設置系統環境變量
      設置Maven_HOME(例如:D:\dev\maven3.3.9)
      設置PATH(例如:%MAVEN_HOME%\bin)ide

  4. mvn -v 檢查是否安裝成功工具

  5. maven倉庫的定位

    1. 配置用戶範圍的settings.xml(MAVEN_HOME/conf/settings.xml拷貝至C:\Users\admin.m2目錄下)

    2. 打開settings.xml文件將倉庫路徑修改(打開復制好的文件並修改裏面的節點內容,指定本身的本地庫。見下圖:)

 

  6. Maven遵循約定優於配置的原則(有約定好的默認值和目錄機構、框架基礎)

項目輸出位置

 

   首次運行mvn compile會看到奇怪的下載內容。。。。。。???

 

  爲了保證Maven順利運行,會從遠程倉庫下載部分jar包到本地庫, 本地庫地址就是你本身配置的MAVEN_HOME/conf/settings.xml文件裏面的內容

    

  當你第一次運行 maven 的時候,它會從網上的 maven 庫 (repository) 下載須要的程序, 存放在你電腦的本地庫 (local repository) 中,因此這個時候你須要有 Internet 鏈接。

    Maven 默認的本地庫是 ~/.m2/repository/ ,

    在 Windows 下是 %USER_HOME%.m2\repository\

  9. 項目單元測試的編譯:mvn test

  10. 打包(生成target目錄,編譯、測試代碼,生成測試報告,生成jar/war文件):mvn package 

  11. 發佈項目提交到本地倉庫:mvn install

  12. Maven的生命週期

  完整的項目構建過程一般包括清理、編譯、測試、打包、集成測試、驗證、部署等步驟,Maven從中抽取了一套完善的、易擴展的生命週期。Maven的生命週期是抽象的,其中的具體任務都交由插件來完成。

Maven的生命週期和插件

  1. 什麼是插件

  定位:C:\Users\~.m2\repository\org\apache\maven\plugins

  

 

  2. 生命週期階段與插件關係

    Maven 的生命週期是抽象的,實際須要插件來完成任務。 這一過程是經過將插件的目標(goal)綁定到生命週期的具體階段(phase)來完成的。 如:將 maven-compiler-plugin插件的compile目標綁定到default生命週期的compile階段,完成項目的源代碼編譯

 

  3. maven的內置插件

    咱們在執行maven命令的時候 mvn clean compile package等, maven會經過本身內置插件幫咱們執行項目的清理/編譯/打包工做, 這些也是經過maven的內置插件實現的

核心概念

座標

 

packageing:定義打包方式,默認jar包,若是是web項目是war包

 

倉庫

   本地庫

    1. ~/.m2/settings.xml/該文件裏面的配置

    2. 每一個用戶只有一個本地倉庫

   遠程庫

    1. 中央庫:Maven默認的遠程倉庫,http://search.maven.org/

    2. 私服庫:是一種特殊的遠程倉庫,它是架設在局域網內的倉庫(例如使用Sonatype Nexus搭建Maven私服 )

  鏡像庫

    1. 用來替代中央倉庫,速度通常比中央倉庫快

依賴

 

  基本概念:
    依賴關係列表(dependency list)是POM的重要部分,也就是咱們項目對jar包的管理
  jar包去哪找?
    http://mvnrepository.org/
    http://search.maven.org/
    http://maven.outofmemory.cn/
  jar如何添?
    示例以下:

    <dependencies>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>4.2.5.RELEASE</version>
      </dependency>
    </dependencies>

 依賴傳遞
    最短路徑:路徑最近者優先(只會選擇路徑最短的一個,不會兩個都下載,否則就是jar包衝突,
實際開發中,maven本身搞定,咱們只須要了解

    最早申明:路徑相同者POM文件裏面的,第一聲明者優先
依賴引用
    說白了,就是須要maven2工程裏面能夠引入maven1工程,
 1) maven1能夠做爲jar包發佈到本地庫
   針對maven1的pom.xml運行 mvn install

 2) 讓maven2的pom.xml裏面引用maven1,做爲jar包填入。
     引用maven1的jar包
    <dependency>
      <groupId>com.****.p2p</groupId>
      <artifactId>maven1</artifactId>
      <version>0.0.1-SNAPSHOT</version>
   </dependency>

 依賴排除
    引用工程之間有一樣功能的jar包,也即jar包重複,如何破?
    新建新工程maven2:
        1. 依賴排除,去重複

               <dependency>
          <groupId>com.atguigu.crm</groupId>
          <artifactId>maven1</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <exclusions><!-- 依賴排除 -->
              <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>       
               </exclusion>
          </exclusions>
       </dependency>
       <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.2</version>  
       </dependency>

        2. jar包重複狀況
        

1 好比Maven02自引用了
     <dependency>
     <groupId>commons-logging</groupId>
     <artifactId>commons-logging</artifactId>
     <version>1.1.2</version>     
   </dependency>


2 Maven03又引用了Maven02+commons-logging-1.1.1.jar


3 問題:commons-logging1.1.2和commons-logging1.1.1會衝突

  
  

 

4 用到了那個?mavne03如何作出選擇?咱們如何手工排除?
   
 4.1 用到了1.1.1
 4.2 依據是最短路徑
 4.3 假如不想用maven02工程的1.1.2,須要在引用包裏面添加

 

 

 

依賴範圍
  maven在構建過程有3套classpath,咱們會根據配置依賴的範圍依賴不一樣的classpath:

  

    compile:默認是compile,對 編譯+測試+運行 都有效
    provided:對編譯和測試,運行的時候不須要加入(例如 jsp 依賴 searvlet api ,好比咱們在編譯和測試的時候有效可是在運行的時候容器已經提供servletapi,若是加入會形成衝突)
    runtime:只在測試和運行時 有效,比較典型的例子 jdbc api,只有在啓動代碼測試或者運行的時候纔會啓用

聚合

  聚合模塊爲項目目錄的最頂層,其餘模塊做爲聚合模塊子目錄而存在。目的是爲一次性批處理各個模塊構建多個項目模塊。

      aggregation聚合,Modules快速構建
        創建整體的聚合工程

        

  聚合pom.xml (切記:<packaging>pom</packaging>)

    

 

 

    

   統一執行聚合工程的pom.xml

  

  生產真實項目maven構建介紹

繼承

  pom繼承是爲了抽出重複配置,一般配置在父模塊中,爲子模塊提供使用,這樣能夠作到「一處聲明,到處使用」。

  Parent繼承,消除重複配置 創建整體的父類繼承工程 繼承pom.xml,父類定義+子類引用

用IDEA創建Maven Web工程

  前提是你的IntelliJ IDEA已經配置好maven了哦!

 

 

 

  接下來,建立過程如圖所示:

 

 

 

 

本文爲博主原創文章,轉載請註明出處!

相關文章
相關標籤/搜索