@[toc]java
現在咱們構建一個項目須要用到不少第三方的類庫,一個項目jar包的數量之多每每讓咱們沒法想象,而且jar包之間的關係錯綜複雜,一個jar包每每又會引用其餘jar包,缺乏任何一個jar包都會致使項目編譯失敗。以往開發項目時,人們每每須要花較多的精力在引用Jar包搭建項目環境上,而這一項工做尤其艱難,由於jar包之間的關係很複雜,當某些jar包無用後,又很難將其從中去除。而Maven就是一款幫助程咱們構建項目的工具,咱們只須要告訴Maven須要哪些jar 包,它會幫助咱們下載全部的jar,極大提高開發效率。web
那麼既然你看到了這篇文章,我暫且就認爲你對Maven有必定的瞭解而且已經完成了Maven的下載安裝和環境變量的配置。關於Maven的安裝配置網上教程有不少,我就不作重複的事情了,咱們直接進入正題。來看看關於Maven的核心概念:spring
那麼,我麼就從這八個方面來深刻學習一下Maven。api
對於目錄結構,Maven有着本身的規定,因此咱們只須要了解Maven自動構建生成的目錄結構及其做用。app
POM(Project Object Model),項目對象模型。在Maven構建的項目中,pom.xml是核心配置文件,與構建過程相關的一切設置都在這個文件中進行配置。重要程序至關於web.xml對於Web工程。框架
咱們類比數學中的座標:在平面上,使用X、Y兩個向量能夠惟一地定位平面上的任何一個點;在空間中,使用X、Y、Z三個向量能夠惟一地定位空間中的任何一個點。那麼在Maven中,使用下面三個向量能夠惟一地定位倉庫中的任何一個點。eclipse
這是一個逐漸縮小範圍的定位,在現實生活中,你要郵寄一個快遞,你得先寫省份,而後寫市區,而後寫縣鄉,最後是具體哪棟樓或某個位置。咱們看一個例子:在倉庫中有這樣一個jar包,咱們如何來定位它呢?咱們看到該文件夾下有一個pom文件,咱們打開看一看:(截取了部分)咱們只看關鍵部分,那麼在Maven中,工程的座標與倉庫中的路徑實際上是同樣的,因此咱們能夠經過這三個向量組拼出一個路徑:webapp
commons-logging/commons-logging-api/1.1/commons-logging-api-1.1.jar複製代碼
jar文件的命名規則是atrifactId - 版本號。而咱們查看倉庫目錄,發現jar文件所處的文件路徑確實如此,這就是Maven管理jar包的一個統一方式。jsp
Maven解析依賴信息時,會到本地倉庫中查找被依賴的jar包。對於咱們本身開發的Maven工程,使用install命令安裝後就能夠進入倉庫。依賴中比較重要的一個概念是依賴範圍,依賴範圍可分爲三類:maven
在主程序中是沒法看到測試程序的,可是在測試程序中可以看到主程序,因此compile範圍對主程序和測試程序都有效,而且參與打包;而test範圍對主程序無效,對測試程序有效,不參與打包;provided範圍對主程序和測試程序都有效,但不參與打包。
這裏簡單提一提關於依賴的傳遞性:在工程中能夠經過其它工程進行一個依賴的傳遞,能夠傳遞的依賴沒必要在每一個模塊工程中都重複聲明,在最底部的工程中依賴一次便可。可是依賴中的傳遞也不是絕對的,例如非compile的依賴沒法傳遞。相反地,依賴具備排除性。當你不想要某些jar包時,就須要設置依賴的排除方式:
<exclusions>
<exclusion>
<groupId></groupId>
<artifactId></artifactId>
</exclusion>
</exclusions>複製代碼
這樣便可將jar包排除,但它只能在當前工程生效。依賴原則:
在Maven中,倉庫可分爲兩類:
而倉庫中保存的內容就是Maven工程,可分爲三類:
Maven中的生命週期,其實就是各個構建環節的順序。構建環節:
這個構建順序不可以被打亂,必須順序執行。Maven的核心程序中定義了抽象的聲明週期,生命週期中各個階段的具體任務是由插件來完成的。Maven有三套相互獨立的生命週期,分別是:
它們是相互獨立的,你能夠僅僅調用clean來清理工做目錄,僅僅調用site來生成站點,固然你也能夠直接運行mvn clean install site運行全部這三套生命週期。關於每套生命週期的具體內容不作分析。而Maven核心程序爲了更好地實現自動化構建,按照這一特色執行生命週期的各個階段:不論如今要執行生命週期中的哪一階段,都是從這個生命週期最初的位置開始執行。
假設一個情景:Hello項目依賴的JUnit版本:4.0Hello2項目依賴的JUnit版本:4.0Hello3項目依賴的JUnit版本:4.9因爲test範圍的依賴不能傳遞,因此必然會分散在各個模塊中,很容易產生版本不一致的問題。那麼咱們就能夠將JUnit依賴版本統一提取到父工程,在子工程中聲明依賴時不指定版本便可,那麼子工程將會以父工程中統一設定的版本爲準,同時也便於修改。注意若是一個工程做爲父工程,打包方式應爲pom。在子工程中使用parent標籤來聲明父類的引用。
做用:一鍵安裝各個模塊工程配置方式:在一個總的聚合工程中配置各個參與聚合的模塊。經過models標籤進行配置。而後只需在聚合工程上執行安裝命令便可一鍵安裝全部模塊工程。
前面說了這麼多關於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命令,必須進入pom.xml文件所在的目錄。經常使用命令:
然而關於這些jar包的依賴信息咱們不可能可以熟記,而事實上咱們也不須要去記,只是在須要的時候上網搜索一下便可。貼上一個查詢依賴信息的網站:https://mvnrepository.com/ 須要什麼jar包的依賴信息,只需在搜索框輸入而後搜索便可。