自動化構建工具Maven

@[toc]java

簡介

現在咱們構建一個項目須要用到不少第三方的類庫,一個項目jar包的數量之多每每讓咱們沒法想象,而且jar包之間的關係錯綜複雜,一個jar包每每又會引用其餘jar包,缺乏任何一個jar包都會致使項目編譯失敗。以往開發項目時,人們每每須要花較多的精力在引用Jar包搭建項目環境上,而這一項工做尤其艱難,由於jar包之間的關係很複雜,當某些jar包無用後,又很難將其從中去除。而Maven就是一款幫助程咱們構建項目的工具,咱們只須要告訴Maven須要哪些jar 包,它會幫助咱們下載全部的jar,極大提高開發效率。web

Maven的核心概念

那麼既然你看到了這篇文章,我暫且就認爲你對Maven有必定的瞭解而且已經完成了Maven的下載安裝和環境變量的配置。關於Maven的安裝配置網上教程有不少,我就不作重複的事情了,咱們直接進入正題。來看看關於Maven的核心概念:spring

  • 約定的目錄結構
  • POM
  • 座標
  • 依賴
  • 倉庫
  • 生命週期
  • 繼承
  • 聚合

那麼,我麼就從這八個方面來深刻學習一下Maven。api

1.約定的目錄結構

對於目錄結構,Maven有着本身的規定,因此咱們只須要了解Maven自動構建生成的目錄結構及其做用。app

2.POM

POM(Project Object Model),項目對象模型。在Maven構建的項目中,pom.xml是核心配置文件,與構建過程相關的一切設置都在這個文件中進行配置。重要程序至關於web.xml對於Web工程。框架

3.座標

咱們類比數學中的座標:在平面上,使用X、Y兩個向量能夠惟一地定位平面上的任何一個點;在空間中,使用X、Y、Z三個向量能夠惟一地定位空間中的任何一個點。那麼在Maven中,使用下面三個向量能夠惟一地定位倉庫中的任何一個點。eclipse

  • groupId:公司或組織域名倒序 + 項目名
  • artifactId:項目名
  • version:版本號

這是一個逐漸縮小範圍的定位,在現實生活中,你要郵寄一個快遞,你得先寫省份,而後寫市區,而後寫縣鄉,最後是具體哪棟樓或某個位置。咱們看一個例子:在這裏插入圖片描述在倉庫中有這樣一個jar包,咱們如何來定位它呢?咱們看到該文件夾下有一個pom文件,咱們打開看一看:(截取了部分)在這裏插入圖片描述咱們只看關鍵部分,那麼在Maven中,工程的座標與倉庫中的路徑實際上是同樣的,因此咱們能夠經過這三個向量組拼出一個路徑:webapp

commons-logging/commons-logging-api/1.1/commons-logging-api-1.1.jar複製代碼

jar文件的命名規則是atrifactId - 版本號。而咱們查看倉庫目錄,發現jar文件所處的文件路徑確實如此,這就是Maven管理jar包的一個統一方式。jsp

4.依賴

Maven解析依賴信息時,會到本地倉庫中查找被依賴的jar包。對於咱們本身開發的Maven工程,使用install命令安裝後就能夠進入倉庫。依賴中比較重要的一個概念是依賴範圍,依賴範圍可分爲三類:maven

  • compile
  • test
  • provided

在主程序中是沒法看到測試程序的,可是在測試程序中可以看到主程序,因此compile範圍對主程序和測試程序都有效,而且參與打包;而test範圍對主程序無效,對測試程序有效,不參與打包;provided範圍對主程序和測試程序都有效,但不參與打包。

這裏簡單提一提關於依賴的傳遞性:在工程中能夠經過其它工程進行一個依賴的傳遞,能夠傳遞的依賴沒必要在每一個模塊工程中都重複聲明,在最底部的工程中依賴一次便可。可是依賴中的傳遞也不是絕對的,例如非compile的依賴沒法傳遞。相反地,依賴具備排除性。當你不想要某些jar包時,就須要設置依賴的排除方式:

<exclusions>
    <exclusion>
        <groupId></groupId>
        <artifactId></artifactId>
    </exclusion>
</exclusions>複製代碼

這樣便可將jar包排除,但它只能在當前工程生效。依賴原則:

  • 驗證路徑最短者優先
  • 驗證路徑相同時先聲明者優先

5.倉庫

在Maven中,倉庫可分爲兩類:

  • 本地倉庫:當前電腦上部署的倉庫目錄,爲當前電腦上全部Maven工程服務
  • 遠程倉庫(遠程倉庫亦可分爲三類):
      - 私服:搭建在當前局域網環境下,爲當前局域網範圍內的全部Maven工程服務
      - 中央倉庫:架設在Internet上,爲全世界全部Maven工程服務
      - 中央倉庫鏡像:架設在各個大洲,爲中央倉庫分擔流量,減輕中央倉庫的壓力,同時更快地響應用戶請求

而倉庫中保存的內容就是Maven工程,可分爲三類:

  • Maven自身所須要的插件
  • 第三方框架或工具的jar包
  • 本身開發的Maven工程

6.生命週期

Maven中的生命週期,其實就是各個構建環節的順序。構建環節:

  • [1]清理:將之前編譯獲得的舊的class字節碼文件刪除,爲下一次編譯作準備
  • [2]編譯:將Java源程序編譯成class字節碼文件
  • [3]測試:自動測試,自動調用JUnit程序
  • [4]報告:測試程序執行的結果
  • [5]打包:動態Web工程打war包,Java工程打jar包
  • [6]安裝:Maven中特定的概念——將打包獲得的文件複製到倉庫中的指定位置
  • [7]部署:將動態Web工程生成的war包複製到Servlet容器的指定目錄下,使其可以正常運行

這個構建順序不可以被打亂,必須順序執行。Maven的核心程序中定義了抽象的聲明週期,生命週期中各個階段的具體任務是由插件來完成的。Maven有三套相互獨立的生命週期,分別是:

  1. Clean Lifecycle:在進行真正的構建以前進行一些清理工做
  2. Default Lifecycle:構建的核心部分,編譯、測試、打包、安裝、部署等等
  3. Site Lifecycle:生成項目報告,站點,發佈站點

它們是相互獨立的,你能夠僅僅調用clean來清理工做目錄,僅僅調用site來生成站點,固然你也能夠直接運行mvn clean install site運行全部這三套生命週期。關於每套生命週期的具體內容不作分析。而Maven核心程序爲了更好地實現自動化構建,按照這一特色執行生命週期的各個階段:不論如今要執行生命週期中的哪一階段,都是從這個生命週期最初的位置開始執行。

7.繼承

假設一個情景:Hello項目依賴的JUnit版本:4.0Hello2項目依賴的JUnit版本:4.0Hello3項目依賴的JUnit版本:4.9因爲test範圍的依賴不能傳遞,因此必然會分散在各個模塊中,很容易產生版本不一致的問題。那麼咱們就能夠將JUnit依賴版本統一提取到父工程,在子工程中聲明依賴時不指定版本便可,那麼子工程將會以父工程中統一設定的版本爲準,同時也便於修改。注意若是一個工程做爲父工程,打包方式應爲pom。在子工程中使用parent標籤來聲明父類的引用。

8.聚合

做用:一鍵安裝各個模塊工程配置方式:在一個總的聚合工程中配置各個參與聚合的模塊。經過models標籤進行配置。而後只需在聚合工程上執行安裝命令便可一鍵安裝全部模塊工程。

Maven插件的設置

前面說了這麼多關於Maven的理論知識,不光本身說得口乾舌燥,看的人確定也已經暈頭轉向了。可是沒辦法, 基礎知識咱們得掌握,而後才能在實際運用中更加駕輕就熟。那麼接下來咱們就實際操做一下Maven工程,這裏以eclipse爲例。首先是Maven插件的設置:只要不是版本特別老的eclipse,它都已經內置了Maven插件,咱們只須要設置一下便可。點擊Windows,而後選擇Preferences打開首選項窗口。在這裏插入圖片描述咱們點擊Installations設置一下Maven的路徑,eclipse會內置一個Maven,但一般認爲內置的Maven不夠好,不夠穩定,因此咱們點擊Add,而後找到咱們本身下載的Maven,添加進去便可。而後User Setting用於指定Maven倉庫的位置,eclipse默認會本身找到。在這裏插入圖片描述設置完畢後,咱們在eclipse中建立一個Maven版的Java工程:右鍵->New->Other->找到Maven Project->Next在這裏插入圖片描述該Java工程默認會有一個JDK版本,若是想直接修改默認JDK版本,能夠來到Maven安裝目錄下的conf目錄,打開settings.xml文件,找到profiles標籤,而後在裏面添加:

<profile>
        <id>jdk-1.7</id>
        <activation>
            <activeByDefalut>true</activeByDefalut>
            <jdk>1.7</jdk>
        </activation>
        <properties>
            <maven.compiler.source>1.7</maven.compiler.source>
            <maven.compiler.target>1.7</maven.compiler.target>
            <maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion>
        </properties>
    <profile>複製代碼

那麼接下來演示一下如何建立Web工程:在這裏插入圖片描述具體建立的是什麼工程,實際上是由Packaging決定,若是選的是jar,則建立Java工程;若是選的是war,則建立Web工程。在這裏插入圖片描述那麼能夠看到的是,Maven構建的Web工程並無web.xml文件,致使工程報錯,webapp下也沒有任何東西,顯然這個Web工程是不完整的,咱們來解決這一問題。右鍵點擊工程,而後選擇Properties,打開配置窗口:在這裏插入圖片描述點擊Projecy Facets,會發新Dynamic Web Module默認是選中的,咱們把勾去掉,接着點擊Apply,而後又把勾打上,這時你會發現下面多出了一個選項,咱們點擊打開窗口:在這裏插入圖片描述按照上面的進行修改,而後點擊OK。如今項目就不報錯了。在這裏插入圖片描述然而當你在webapp目錄下新建了一個jsp文件後,項目又報錯了。在這裏插入圖片描述這是由於項目中缺乏Apache Tomcat的運行環境,那怎麼解決呢?打開pom.xml,咱們知道,HttpServlet在servlet-api的jar包下,那麼咱們就能夠經過pom文件進行該jar包的導入,在pom.xml文件中添加下面的依賴:

<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
</dependencies>複製代碼

點擊保存後項目立馬就不報錯了。而後咱們運行一下程序,程序正確運行,接着來到部署目錄下,發現lib目錄是空的。在這裏插入圖片描述這是由於依賴的範圍是provided,若是咱們將依賴範圍設置爲compile,再運行看效果。在這裏插入圖片描述這時候jar包就被下載到了lib目錄。這也解釋了上面說的依賴範圍關係。如今咱們來到index.jsp文件編寫一條EL表達式:在這裏插入圖片描述會發現pageContext後面沒有提示而request有,這是由於request是serlvet-api包下的,而這個jar包咱們在剛纔已經導入了,因此,咱們只須要導入pageContext所在的jar包便可,在pom文件下添加一條依賴:

<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.1.3-b06</version>
    <scope>provided</scope>
</dependency>複製代碼

如今pageContext的提示就出來了。在這裏插入圖片描述關於依賴的範圍問題要尤其重視,若是你將jsp-api的範圍設置爲compile,項目運行後會產生一個空指針異常,顯然這個異常不是咱們的代碼產生的,由於咱們壓根就沒寫什麼代碼。若是依賴範圍設置爲了compile,咱們知道jar包是會被下載到lib目錄下的,而jsp-api須要依賴兩個jar包,這樣總共就下載了三個jar包,而這些jar包在Tomcat中也存在。此時這些jar包就會產生衝突,從而形成一些沒法理解的錯誤。因此依賴範圍必定要嚴謹。

統一管理依賴的版本

假如咱們在作一個項目,一開始使用的是spring4.0的版本,可是後面咱們須要對jar包進行升級,將版本升級爲5.0,該如何升級呢?咱們知道,spring框架所依賴的jar包很是多,一個一個地在pom文件中進行修改顯然不合理。那麼在pom中,咱們有一個很好的配置方式:[1]使用properties標籤內部使用自定義標籤統一聲明版本號[2]在須要統一版本的位置,使用${自定義標籤名}引用聲明的版本號

經常使用Maven命令

注意:執行與構建過程相關的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:生成站點

然而關於這些jar包的依賴信息咱們不可能可以熟記,而事實上咱們也不須要去記,只是在須要的時候上網搜索一下便可。貼上一個查詢依賴信息的網站:https://mvnrepository.com/ 須要什麼jar包的依賴信息,只需在搜索框輸入而後搜索便可。在這裏插入圖片描述

相關文章
相關標籤/搜索