1、概念:java
Maven是一個項目管理工具,它包含了一個項目對象模型(Project Object Model),一組標準集合,一個項目生命週期(Project Lifecycle),一個依賴管理系統(Dependency Management System),和用來運行定義在生命週期階段(phase)中插件(plugin)目標(goal)的邏輯。web
一、項目構建流程:apache
二、Maven項目目錄:api
2、倉庫:服務器
Maven的倉庫三種:本地倉庫、中央倉庫、遠程倉庫;網絡
(一) 本地倉庫:框架
本地倉庫是指 maven 下載了插件或者 jar 文件後存放在本地機器上的拷貝。在 Linux 上,它的位置在 ~/.m2/repository,在 Windows XP 上,在 C:\Documents and Settings\username\.m2\repository ,在 Windows 7 上,在 C:\Users\username\.m2\repository。當 maven 查找須要的 jar 文件時,它會先在本地倉庫中尋找,只有在找不到的狀況下,纔會去遠程庫中找。maven
能夠在%MAVEN_HOME%/conf/settings.xml中設置localRepository的值來修改本地倉庫路徑ide
運行 mvn install 能夠把咱們的項目安裝到本地庫;工具
(二) 中央倉庫:
Maven的中央倉庫由Maven社區提供,默認地址是http://repo1.maven.org/maven2,全部不在本地倉庫中的依賴都會去這個中央倉庫查找。而後Maven會將這些依賴下載到你的本地倉庫。訪問中央倉庫不須要作額外的配置。
(三) 遠程倉庫:
遠程倉庫通常用於放置組織內部的項目,該項目由多個項目共享;
遠程倉庫是位於web服務器上的一個倉庫,Maven能夠從該倉庫下載依賴,就像從中央倉庫下載依賴同樣。遠程倉庫能夠位於Internet上的任何地方,也能夠是位於本地網絡中。
遠程倉庫不能被外部訪問,所以不能放在公開的中央倉庫下,而應該放到內部的遠程倉庫中。
遠程倉庫中的依賴也會被Maven下載到本地倉庫中。
能夠在pom文件裏配置遠程倉庫。將如下的xml片斷放到屬性以後:
1 <repositories> 2 <repository> 3 <id>jenkov.code</id> 4 <url>http://maven.jenkov.com/maven2/lib</url> 5 </repository> 6 </repositories> |
3、安裝:
一、JDK的安裝;
二、在Apache的官網上http://maven.apache.org/download.cgi下載最新版本的Binary zip archive包並解壓到硬盤上的某個路徑下;
三、配置環境變量:
a) 添加環境變量M2_HOME,值爲maven包的路徑;
b) 在環境變量PATH裏面添加maven的bin的路徑;
四、測試安裝是否成功:
在cmd命令行窗口下輸入:mvn –version,若是顯示出maven的版本號,則說明安裝成功;
五、Eclipse配置:
a) 配置maven的安裝路徑:
在上圖中點擊「Add」按鈕,而後Maven的路徑,肯定後就會在列表中顯示;
b) 配置maven 本地庫的路徑:
在上圖中點擊「Browser」按鈕,選擇maven路徑下的settings.xml文件,settings.xml中配置的localRepository項的值就會顯示在下面;
c) 運行參數配置:
選擇jdk項,點擊「編輯」按鈕,在下面的缺省VM參數裏面輸入:
-Dmaven.multiModuleProjectDirectory=$M2_HOME
4、經常使用命令:
5、生命週期:
一、 Maven有三個內嵌的生命週期:clean是刪除target目錄中以前生成的.class和.jar等文件;default是默認生命週期,負責項目的編譯和打包; site關注的是爲項目生成文檔,實際上site能夠爲項目生成一個網頁式的文檔。
二、 每個生命週期被分爲一系列的構建階段,構建階段又被分爲一系列的構建目標。所以,整個構建過程由一系列的生命週期、構建階段和構建目標組成。
三、 你能夠執行一個生命週期,如clean或site,一個構建階段,如default生命期的install,或者一個構建目標,如dependency:copy-dependencies。注意:你不能直接執行default生命期,你須要指定default生命期中的一個構建階段或者構建目標。
四、 將構建階段的名稱做爲參數傳給mvn命令,就是執行該構建階段,如:mvn package。
(一) Clean清理項目:
a) pre-clean 執行清理前的工做
b) clean 清理上一次構建生成的全部文件
c) post-clean 執行清理後的文件
(二) Default構建項目:
d) compile 編譯項目中的源代碼;
e) test 使用合適的單元測試框架進行測試,這些測試代碼不會被打包或部署;
f) test-compile 將須要測試的源代碼編譯到路徑,通常是編譯src/test/java目錄下的java文件至目標輸出的測試classpath目錄中;
g) package 接受編譯好的代碼,打包成可發佈的格式,如JAR;
h) install 將包安裝到本地倉庫,給其餘本地引用提供依賴;
(三) Site生成項目站點:
i) pre-site 在生成項目站點前要完成的工做;
j) site 生成項目的站點文檔;
k) post-site 在生成項目站點後要完成的工做;
l) site-deploy 發佈生成的站點到服務器上;
6、新建maven項目:
一、新建maven工程:
二、選擇工程類型 (Version -RELEASE):
三、輸入工程信息:
四、運行項目:
單擊右鍵項目"run as"--->maven build,在Navigator視圖下能夠看到target目錄下有文件了。
注意:若是運行時提示「No goals have been specified for this build…………」,則須要打開運行配置窗口,而後在Goals中輸入「compile」就行:
7、POM文件:
一、dependencyManagement與dependencies的區別:
dependencies:全部聲明在父項目中 dependencies 裏的依賴都會被子項目自動引入,並默認被全部的子項目繼承。即便在子項目中不寫該依賴項,那麼子項目仍然會從父項目中繼承該依賴項(所有繼承)
dependencyManagement :只是聲明依賴,並不實現引入,所以子項目須要顯示的聲明須要用的依賴。若是不在子項目中聲明依賴,是不會從父項目中繼承下來的;只有在子項目中寫了該依賴項,而且沒有指定具體版本,纔會從父項目中繼承該項,而且 version 和 scope 都讀取自父 pom; 另外若是子項目中指定了版本號,那麼會使用子項目中指定的jar版本。
好比以下配置:
首先在父POM中定義:
1 <properties> 2 <javaee-api.version>1.0-SNAPSHOT</javaee-api.version> 3 </properties> 4 <dependencyManagement> 5 <dependencies> 6 <dependency> 7 <groupId>javax</groupId> 8 <artifactId>javaee-api</artifactId> 9 <version>${javaee-api.version}</version> 10 </dependency> 11 </dependencies> 12 </dependencyManagement> |
接着在子POM中定義以下:
1 <parent> 2 <artifactId>parent</artifactId> 3 <groupId>com.zhisheng</groupId> 4 <version>0.0.1-SNAPSHOT</version> 5 </parent> 6 <dependencies> 7 <dependency> 8 <groupId>javax</groupId> 9 <artifactId>javaee-api</artifactId> 10 </dependency> 11 </dependencies> |
二、plugins與dependencyManagement的區別:
pluginManagement是表示插件聲明,即你在項目中的pluginManagement下聲明瞭插件,Maven不會加載該插件,pluginManagement聲明能夠被繼承。pluginManagement通常是用來在父POM中定義,提供給子POM使用,子POM也能夠覆蓋這個定義,並且你在父POM中定義了版本以後,子模塊中直接應用groupId和artifactId,而不用指定版本,同時也方便統一管理;而在父POM中的pluginManagement並不會介入到Maven的生命週期。pluginManagement主要是爲了統一管理插件,確保全部子POM使用的插件版本保持一致,相似dependencies和dependencyManagement。
Plugins:就是直接引入一個plugin,並且能夠綁定到Maven相關的生命週期上。
8、依賴管理:
一、假設你的項目依賴於一個庫,而這個庫又依賴於其餘庫。你沒必要本身去找出全部這些依賴,你只須要加上你直接依賴的庫,Maven會隱式的把這些庫間接依賴的庫也加入到你的項目中。
二、傳遞性依賴的嵌套深度沒有任何限制,只是在出現循環依賴時會報錯。
三、「短路徑優先」意味着項目依賴關係樹中路徑最短的版本會被使用。例如,假設A、B、C之間的依賴關係是A->B->C->D(2.0)和A->E->(D1.0),那麼D(1.0)會被使用,由於A經過E到D的路徑更短。但若是你想要強制使用D(2.0),那你也能夠在A中顯式聲明對D(2.0)的依賴。
四、依賴範圍 – 你能夠指定只在當前編譯範圍內包含合適的依賴。
a) Compile:這是默認範圍。若是沒有指定,就會使用該依賴範圍。編譯依賴對項目全部的classpath均可用。此外,編譯依賴會傳遞到依賴的項目。
b) Provided:和compile範圍很相似,但provided範圍代表你但願由JDK或者某個容器提供運行時依賴。例如,當使用Java EE構建一個web應用時,你會設置對Servlet API和相關的Java EE APIs的依賴範圍爲provided,由於web容器提供了運行時的依賴。provided依賴只對編譯和測試classpath有效,而且不能傳遞。
c) runtime:runtime範圍代表編譯時不須要依賴,而只在運行時依賴。此依賴範圍對運行和測試classpath有效,對編譯classpath無效。
d) test:test範圍代表使用此依賴範圍的依賴,只在編譯測試代碼和運行測試的時候須要,應用的正常運行不須要此類依賴。
e) system:系統範圍與provided相似,不過你必須顯式指定一個本地系統路徑的JAR,此類依賴應該一直有效,Maven也不會去倉庫中尋找它。
f) import(Maven2.0.9及以上):import範圍只適用於pom文件中的部分。代表指定的POM必須使用部分的依賴。由於依賴已經被替換,因此使用import範圍的依賴並不影響依賴傳遞。
五、排除依賴 – 若是項目X依賴於項目Y,項目Y又依賴項目Z,項目X的全部者可使用」exclusion」元素來顯式排除項目Z。
六、可選依賴 – 若是項目Y依賴項目Z,項目Y的全部者可使用」optional」元素來指定項目Z做爲X的可選依賴。那麼當項目X依賴項目Y時,X只依賴Y並不依賴Y的可選依賴Z。項目X的全部者也能夠根據本身的意願顯式指定X對Z的依賴。(你能夠把可選依賴理解爲默認排除)。
(一) 項目依賴:
項目A依賴項目B,項目B依賴項目C.衆多的項目造成一個有向無環圖(DAG),使用maven,就能夠自動推導出項目所依賴的所有jar包。
在pom.xml中進行以下配置:
1 <dependencies> 2 <dependency> 3 <groupId>org.jsoup</groupId> 4 <artifactId>jsoup</artifactId> 5 <version>1.7.1</version> 6 </dependency> 7 <dependency> 8 <groupId>junit</groupId> 9 <artifactId>junit</artifactId> 10 <version>4.8.1</version> 11 <scope>test</scope> 12 </dependency> 13 </dependencies> |
(二) 外部依賴:
有時只有一個jar包而沒有它的groupId和artifactId,而且三種maven倉庫中都沒有這個jar包項目,但當前項目依賴這個jar包,這種依賴叫作外部依賴。
有兩個方法解決:
一、在每一個maven項目的pom.xml文件中以下配置:
1 <dependency> 2 <groupId>mydependency</groupId> 3 <artifactId>mydependency</artifactId> 4 <scope>system</scope> 5 <version>1.0</version> 6 <systemPath>${basedir}\mydependency.jar</systemPath> 7 </dependency> |
二、方法一太過麻煩,能夠將第三方jar包安裝到本地maven倉庫中去:
mvn install:install-file -Dfile=xxx -DgroupId=xxx -DartifactId=xxx -Dversion=xxx -Dpackaging=xxx
其中packaging是打包類型,能夠取值war,jar等。
若是第三方jar包有相應的pom.xml,則沒必要提供groupId,artifactId等信息,由於它們都在pom.xml裏面寫着呢.可使用以下命令:
mvn install:install-file -Dfile=xxx -DpomFile=xxx
(三) 快照依賴:
快照依賴指的是那些還在開發中的依賴(jar包)。與其常常地更新版本號來獲取最新版本,不如你直接依賴項目的快照版本。快照版本的每個build版本都會被下載到本地倉庫,即便該快照版本已經在本地倉庫了。老是下載快照依賴能夠確保本地倉庫中的每個build版本都是最新的。
在pom文件的最開頭的版本號後追加-SNAPSHOT,則告訴Maven你的項目是一個快照版本。如:
<version>1.0-SNAPSHOT</version>
在配置依賴時,在版本號後追加-SNAPSHOT代表依賴的是一個快照版本。
9、Maven工程類型:
Maven工程類型有三種:
一、WAR包工程;
二、JAR包工程;
三、POM工程;
工程之間的關係:
一、依賴:經過在 dependencies 元素下添加 dependency 子元素,能夠聲明一個或多個依賴。
依賴是具備傳遞性的。
二、聚合:一個項目每每是由多個 project 構成的,在進行構建時,咱們固然不想針對多個 project 分別執行屢次構建命令,這樣極容易產生遺漏也會大大下降效率。Maven的聚合功能能夠經過一個父模塊將全部的要構建模塊整合起來,將父模塊的打包類型聲明爲 POM,經過 <modules> 將各模塊集中到父 POM 中。配置以下:
1 <modules> 2 <module>../com.dugeng.project1</module> 3 <module>../com.dugeng.project2</module> 4 </modules> |
父類型的模塊,不須要有源代碼和資源文件,也就是說,沒有 src/main/java 和 src/test/java 目錄。Maven 會首先解析聚合模塊的 POM 文件,分析要構建的模塊,並經過各模塊的依賴關係計算出模塊的執行順序,根據這個潛在的關係依次構建模塊。將各子模塊聚合到父模塊中後,咱們就能夠對父模塊進行一次構建命令來完成所有模塊的構建。
三、繼承:經過構建父模塊將子模塊共用的依賴,插件等進行統一聲明。
例如將 com.dugeng.parent 這個模塊聲明爲 project1 和 project2 的父模塊,那麼咱們在 project1 和 2 中用以下代碼聲明父子關係:
1 <parent> 2 <groupId>com.dugeng.mavenproject</groupId> 3 <artifactId>com.dugeng.parent</artifactId> 4 <version>0.0.1-SNAPSHOT</version> 5 <relativePath>../com.dugeng.parent/pom.xml</relativePath> 6 </parent> |
因爲父模塊只是用來聲明一些可共用的配置和插件信息,因此它也像聚合模塊同樣只須要包括一個 POM 文件,其它的項目文件如 src/main/java 是不須要的。
父工程應該是一個POM工程;