Maven項目管理工具

1. Maven簡介

  • 1.1 什麼是Maven?
    Maven 的正確發音是[ˈmevən],而不是“馬瘟”以及其他什麼瘟。Maven 在美國是一個口語化的詞語,代表專家、內行的意思。
    一個對 Maven 比較正式的定義是這麼說的:Maven 是一個項目管理工具,它包含了一個 項目對象模型(POM:Project Object Model),一組標準集合,一個項目生命週期(Project Lifecycle),一個依賴管理系統(Dependency Management System),和用來運行定義在生命週期階段(phase)中插件(plugin)目標(goal)的邏輯。

  • 1.2 Maven的功能

    Maven能幫你構建工程,管理 jar包,編譯代碼,還能幫你自動運行單元測試,打包,生成報表,甚至能幫你部署項目,生成 Web 站點。

  • 1.3 Maven 的兩個精典作用

  • 1.3.1 Maven的依賴管理
    在這裏插入圖片描述
    maven 工程中不直接將 jar 包導入到工程中,而是通過在 pom.xml 文件中添加所需 jar包的座標,這樣就很好的避免了 jar 直接引入進來,在需要用到 jar 包的時候,只要查找 pom.xml 文件,再通過 pom.xml 文件中的座標,到一個專門用於”存放 jar 包的倉庫”(maven 倉庫)中根據座標從而找到這些 jar 包,再把這些 jar 包拿去運行。

  • 1.3.2 項目的一鍵構建
    項目構建指的是項目從編譯、測試、運行、打包、安裝 ,部署整個過程都交給 maven 進行管理,這個過程稱爲構建。
    一鍵構建
    指的是整個構建過程,使用 maven 一個命令可以輕鬆完成整個工作。
    Maven 規範化構建流程如下:
    在這裏插入圖片描述

2. Maven使用

  • 2.1Maven的安裝

  • 2.1.1 Maven的下載

    以Apache-maven-3.5.2爲例,下載地址爲:http://archive.apache.org/dist/maven/maven-3/

  • 2.1.2Maven的安裝
    Maven 下載後,將 Maven 解壓到一個沒有中文沒有空格的路徑下,比如 D:\software\maven 下面。
    解壓後目錄結構如下:
    在這裏插入圖片描述
    bin:存放了 maven 的命令,比如我們前面用到的mvn tomcat:run
    boot:存放了一些 maven 本身的引導程序,如類加載器等
    conf:存放了 maven 的一些配置文件,如 setting.xml 文件
    lib:存放了 maven 本身運行所需的一些 jar 包
    至此我們的 maven 軟件就可以使用了,前提是你的電腦上之前已經安裝並配置好了 JDK。

  • 2.1.3 Maven及JDK配置
    電腦上需安裝 java 環境,安裝 JDK1.7 + 版本 (將JAVA_HOME/bin 配置環境變量 path ),我們使用的是JDK8 相關版本
    配置 MAVEN_HOME ,變量值就是你的 maven 安裝 的路徑(bin目錄之前一級目錄)

在這裏插入圖片描述
上面配置了我們的 Maven 軟件,注意這個目錄就是之前你解壓 maven 的壓縮文件包在的的目錄,最好不要有中文和空格。

  • 2.1.4 Maven 軟件版本測試
    通過 mvn -v命令檢查 maven 是否安裝成功,看到 maven 的版本爲 3.5.2 及 java 版本爲 1.8 即爲安裝成功。
    找開 cmd 命令,輸入 mvn –v命令,如下圖:
    在這裏插入圖片描述

  • 2.2 Maven 倉庫

  • 2.2.1 Maven 倉庫的分類

    本地倉庫 :用來存儲從遠程倉庫或中央倉庫下載的插件和 jar 包,項目使用一些插件或 jar 包,優先從本地倉庫查找
    默認本地倉庫位置在 ${user.dir}/.m2/repository${user.dir}表示windows 用戶目錄。

    遠程倉庫(私服):如果本地需要插件或者 jar 包,本地倉庫沒有,默認去遠程倉庫下載。
    遠程倉庫可以在互聯網內也可以在局域網內。

    中央倉庫 :在 maven 軟件中內置一個遠程倉庫地址 http://repo1.maven.org/maven2 ,它是中
    央倉庫,服務於整個互聯網,它是由 Maven 團隊自己維護,裏面存儲了非常全的 jar 包,它包
    含了世界上大部分流行的開源項目構件。

  • 2.2.2 Maven 本地倉庫的配置

    MAVE_HOME/conf/settings.xml 文件中配置本地倉庫位置(maven 的安裝目錄下):
    打開 settings.xml文件,配置如下:

 <!-- localRepository 配置本地倉庫地址
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
  -->
  <localRepository>D:\workSpace\plugins\maven\mavenRepository\maven_jar</localRepository>
.....................................
...
.....................................
  <mirrors>
    <!-- mirror 配置遠程倉庫和中央倉庫地址
     | Specifies a repository mirror site to use instead of a given repository. The repository that
     | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
     | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
     |
    <mirror>
      <id>mirrorId</id>
      <mirrorOf>repositoryId</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
      <url>http://my.repository.com/repo/path</url>
    </mirror>
     -->
	 <mirror>
        <id>alimaven</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>
    </mirror>
  </mirrors>
  • 2.2.3 全局 setting 與 用戶 setting
    maven 倉庫地址、私服等配置信息需要在 setting.xml 文件中配置,分爲全局配置和用戶配置。在 maven 安裝目錄下的有 conf/setting.xml 文件,此 setting.xml 文件用於 maven 的所有 project項目,它作爲 maven 的全局配置。
    如需要個性配置則需要在用戶配置中設置,用戶配置的 setting.xml 文件默認的位置在:${user.dir}/.m2/settings.xml 目錄中,${user.dir} 指windows 中的用戶目錄。
    maven會先找用戶配置,如果找到則以用戶配置文件爲準,否則使用全局配置文件。

  • 2.3 Maven 工程的認識

  • 2.3.1 Maven 工程的目錄結構
    在這裏插入圖片描述
    作爲一個 maven 工程,它的 src目錄和 pom.xml 是必備的。
    進入 src目錄後,我們發現它裏面的目錄結構如下:
    在這裏插入圖片描述
    src/main/java —— 存放項目的.java 文件
    src/main/resources —— 存放項目資源文件,如 spring, hibernate 配置文件
    src/test/java —— 存放所有單元測試.java 文件,如 JUnit 測試類
    src/test/resources —— 測試資源文件
    target —— 項目輸出位置,編譯後的class 文件會輸出到此目錄
    pom.xml——maven 項目核心配置文件

    注意:如果是普通的 java 項目,那麼就沒有webapp 目錄。

3. Maven常用命令

我們可以在cmd 中通過一系列的 maven 命令來對我們的 maven-helloworld 工程進行編譯、測試、運行、打包、安裝、部署。

  • 3.1.1 compile

    compile 是 maven 工程的編譯命令,作用是將 src/main/java 下的文件編譯爲 class 文件輸出到 target目錄下。
    cmd 進入命令狀態,執行mvn compile,如下圖提示成功:
    在這裏插入圖片描述
    查看 target 目錄,class 文件已生成,編譯完成。

  • 3.1.2 test

    test 是 maven 工程的測試命令 mvn test,會執行src/test/java下的單元測試類。
    cmd 執行 mvn test 執行 src/test/java 下單元測試類,下圖爲測試結果,運行 1 個測試用例,全部成功。
    在這裏插入圖片描述

  • 3.1.3 clean

    clean 是 maven 工程的清理命令,執行 clean 會刪除 target 目錄及內容。

  • 3.1.4 package

    package 是 maven 工程的打包命令,對於 java 工程執行 package 打成 jar 包,對於web 工程打成war包。

  • 3.1.5 install

    install 是 maven 工程的安裝命令,執行 install 將 maven 打成 jar 包或 war 包發佈到本地倉庫。

從運行結果中,可以看出:
當後面的命令執行時,前面的操作過程也都會自動執行。

4. Maven生命週期

  • 4.1 Maven 指令的生命週期

    maven 對項目構建過程分爲三套相互獨立的生命週期,請注意這裏說的是“三套”,而且“相互獨立”,
    這三套生命週期分別是:
    Clean Lifecycle 在進行真正的構建之前進行一些清理工作。
    Default Lifecycle (默認生命週期)構建的核心部分,編譯,測試,打包,部署等等。
    Site Lifecycle 生成項目報告,站點,發佈站點。

  • 4.2Maven的概念模型

    Maven 包含了一個項目對象模型 (Project Object Model),一組標準集合,一個項目生命週期(ProjectLifecycle),一個依賴管理系統(Dependency Management System),和用來運行定義在生命週期階段(phase)中插件(plugin)目標(goal)的邏輯。
    每一個maven指令的底層都對應一個插件。在這裏插入圖片描述

  • 項目對象模型 (Project Object Model)

    一個 maven 工程都有一個 pom.xml 文件,通過 pom.xml 文件定義項目的座標、項目依賴、項目信息、插件目標等。

  • 依賴管理系統(Dependency Management System)

    通過 maven 的依賴管理對項目所依賴的 jar 包進行統一管理。
    比如:項目依賴 junit4.9,通過在 pom.xml 中定義 junit4.9 的依賴即使用 junit4.9,如下所示是 junit4.9的依賴定義:

 <!-- 依賴關係 -->
    <dependencies>
   			<!-- 此項目運行使用 junit,所以此項目依賴 junit -->
    		<dependency>
    			<!-- junit 的項目名稱 -->
    			<groupId>junit</groupId>
    			<!-- junit 的模塊名稱 -->
			    <artifactId>junit</artifactId>
			    <!-- junit 版本 -->
			    <version>4.9</version>
			    <!-- 依賴範圍:單元測試時使用 junit -->
			    <scope>test</scope>
		    </dependency>
    </dependencies>
  • 一個項目生命週期(Project Lifecycle)

    使用 maven 完成項目的構建,項目構建包括:清理、編譯、測試、部署等過程,maven 將這些過程規範爲一個生命週期,如下所示是生命週期的各各階段:
    在這裏插入圖片描述
    maven 通過執行一些簡單命令即可實現上邊生命週期的各各過程,比如執行 mvn compile 執行編譯、執行 mvn clean 執行清理。

5.Maven中常見配置

  • 5.1依賴範圍
    A 依賴 B,需要在 A 的 pom.xml 文件中添加 B 的座標,添加座標時需要指定依賴範圍,依賴範圍包括:
	 compile:編譯範圍,指 A在編譯時依賴 B,此範圍爲默認依賴範圍。編譯範圍的依賴會用在編譯、測試、運行,由於運行時需要所以編譯範圍的依賴會被打包。
	
	  provided:provided 依賴只有在當 JDK 或者一個容器已提供該依賴之後才使用, provided 依賴在編譯和測試時需要,在運行時不需要,比如:servlet api 被 tomcat 容器提供。

	  runtime:runtime 依賴在運行和測試系統的時候需要,但在編譯的時候不需要。比如:jdbc的驅動包。由於運行時需要所以 runtime 範圍的依賴會被打包。

	  test:test 範圍依賴 在編譯和運行時都不需要,它們只有在測試編譯和測試運行階段可用,比如:junit。由於運行時不需要所以test範圍依賴不會被打包。

	  system:system 範圍依賴與 provided 類似,但是你必須顯式的提供一個對於本地系統中 JAR文件的路徑,需要指定 systemPath 磁盤路徑,system依賴不推薦使用。

在這裏插入圖片描述

在 maven-web 工程中測試各各 scop。
測試總結:

  默認引入 的 jar 包 ------- compile 【默認範圍 可以不寫】(編譯、測試、運行 都有效 )
  servlet-api 、jsp-api ------- provided (編譯、測試 有效, 運行時無效 防止和 tomcat 下 jar 衝突)
  jdbc 驅動 jar 包 ---- runtime (測試、運行 有效 )
  junit ----- test (測試有效)

依賴範圍由強到弱的順序是:compile>provided>runtime>test

  • 5.2 設置 jdk 編譯版本
    本教程使用 jdk1.8,需要設置編譯版本爲 1.8,這裏需要使用 maven 的插件來設置:
    在 pom.xml 中加入:
<build>
	<plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<configuration>
					<source>1.8</source>
					<target>1.8</target>
					<encoding>UTF-8</encoding>
			</configuration>
			</plugin>
	</plugins>
</build>
  • 5.3 添加 tomcat7 插件
    在 pom 文件中添加如下內容
    在這裏插入圖片描述

6. 總結

  • 6.1 maven 倉庫
    1、maven 倉庫的類型有哪些?
    本地倉庫、遠程倉庫(私服)、中央倉庫。

    2、maven 工程查找倉庫的流程是什麼?
    本地倉庫》遠程倉庫(私服)》中央倉庫。

    3、本地倉庫如何配置?
    pom.xml文件中配置localRepository屬性。

  • 6.2 常用的 maven 命令

    常用 的 maven 命令包括:
    compile:編譯
    clean:清理
    test:測試
    package:打包
    install:安裝

  • 6.3 座標定義

    在 pom.xml 中定義座標,內容包括:groupId、artifactId、version,詳細內容如下:

	<!--項目名稱,定義爲組織名+項目名,類似包名-->
	<groupId>cn.itcast.maven</groupId>
	<!-- 模塊名稱 -->
    <artifactId>maven-first</artifactId>
    <!-- 當前項目版本號,snapshot 爲快照版本即非正式版本,release爲正式發佈版本 -->
    <version>0.0.1-SNAPSHOT</version>
   
	<packaging > :打包類型
			jar:執行 package 會打成 jar 包
			war:執行 package 會打成 war 包
			pom :用於 maven 工程的繼承,通常父工程設置爲 pom

  • 6.4 pom.xml 的基本配置
    pom.xml 是 Maven 項目的核心配置文件,位於每個工程的根目錄,基本配置如下:
	<project > :文件的根節點 .
	<modelversion > : pom.xml 使用的對象模型版本
	<groupId > :項目名稱,一般寫項目的域名
	<artifactId > :模塊名稱,子項目名或模塊名稱
	<version > :產品的版本號 .
	<packaging > :打包類型,一般有 jar、war、pom 等
	<name > :項目的顯示名,常用於 Maven 生成的文檔。
	<description > :項目描述,常用於 Maven 生成的文檔
	<dependencies> :項目依賴構件配置,配置項目依賴構件的座標
	<build> :項目構建配置,配置編譯、運行插件等。
  • 6.5 jar包依賴衝突調解原則
    maven 自動按照下邊的原則調解:

  • 1 、第一聲明者優先原則
    在 pom 文件定義依賴,先聲明的依賴爲準(從上往下)。

  • 2 、路徑近者優先原則
    直接依賴優先於傳遞依賴。

  • 3、 排除依賴
    使用<exclusion>標籤排除。
    在這裏插入圖片描述

  • 4、鎖定版本
    面對衆多的依賴,有一種方法不用考慮依賴路徑、聲明優化等因素可以採用直接鎖定版本的方法確定依賴構件的版本,版本鎖定後則不考慮依賴的聲明順序或依賴的路徑,以鎖定的版本的爲準添加到工程中,此方法在企業開發中常用。
    如下的配置是鎖定了 spring-beans 和 spring-context 的版本:
    在這裏插入圖片描述

    還可以把版本號提取出來,使用標籤設置成變量。
    在這裏插入圖片描述

    注意:在工程中鎖定依賴的版本並不代表在工程中添加了依賴,如果工程需要添加鎖定版本的依賴則需要單獨添加<dependencies></dependencies>標籤,如下:
    在這裏插入圖片描述

    上邊添加的依賴並沒有指定版本,原因是已在<dependencyManagement>中鎖定了版本,所以在<dependency>下不需要再指定版本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章