Maven的核心對你項目構建中特定的任務(wù)幾乎毫無(wú)所知。它本身不知道如何編譯你的代碼,
甚至不知道如何制作一個(gè)JAR文件,它把這些所有的任務(wù)交給了Maven插件。
1.Maven插件和目標(pluginId:goalId)
一個(gè)插件是一個(gè)或者多個(gè)目標的集合。
一個(gè)目標是一個(gè)明確的任務(wù)
mvn arthetype:create(arthetype表示插件,create表示目標)
-DgroupId=org.sonatype.mavenbook.ch03 -DartifactId=simple
-DpackageName=org.sonatype.mavenbook
這是傳入的參數,以-D開(kāi)頭,分別傳入了groupId和artifactId,packageName等。
2.Maven生命周期
是一個(gè)項目編譯的生命周期,比如:驗證,測試,發(fā)布等。當Maven經(jīng)過(guò)package為結尾的默認生命周期的時(shí)候,則會(huì )按照下面的生命周期執行:
resuorce:resources(復制資源到輸出目錄)/
compiler:compile(編譯源碼和其他任何配置得資源目錄到輸出目錄)/
resource:textResource(到測試輸出目錄)/compiler:testCompile(到測試輸出目錄)/
surefire:test(運行測試)/jar:jar(把輸出目錄打包成JAR文件)
也可以在命令中指定步驟:mvn resuorce:resources compiler:compile。。。
3.Maven坐標

紅色的部分為目標,已經(jīng)標記出來(lái)。坐標就想標記一樣,當需要引用或者其關(guān)聯(lián)其他項目的時(shí)候,Maven通過(guò)坐標來(lái)精確定位一個(gè)項目。
Maven坐標通常用冒號來(lái)作為分隔符書(shū)寫(xiě),像下面的格式:groupId:artifactId:packaging:version。比如上面可以表示為mavenbook:my-app:pachaging:version。這個(gè)符號也可以用于項目依賴(lài)。
groupId:團體的標示,比如org.apache
artifactId:在groupId下單獨項目的唯一標識符
version:一個(gè)項目的特定版本。發(fā)布的項目有一個(gè)固定的版本標識來(lái)指向該項目的某一個(gè)特定版本。
Packaging:項目的類(lèi)型,默認是jar。
4.Maven倉庫
在一個(gè)Maven倉庫中,所有的東西存儲在一個(gè)與Maven項目坐標十分匹配的目錄結構中。標準如下:

5.添加依賴(lài)
添加依賴(lài),通過(guò)dependencies
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
<scope>test</scope>
</dependency>
</dependencies>
對于只有在測試的時(shí)候用到的依賴(lài),可以加入scope=test來(lái)表示
6..關(guān)于測試
對于測試,不用做太多的特殊操作,在test文件夾下,寫(xiě)好測試的類(lèi)之后,只要運行mvn test。當然在運行mvn package或者mvn install的時(shí)候,你也運行了測試。
如果測試失敗,你依然像產(chǎn)生構建輸出,可以設置testFailureIgnore為true,甚至有時(shí)候你想跳過(guò)單元測試,那么可以添加skip屬性,跳過(guò)。
<plugin><!-- 失敗了以后還是繼續構建-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
<skip>true</skip> <!--跳過(guò)單元測試-->
</configuration>
</plugin>
7.關(guān)于repositories和pluginRepositories
# <repository>
# <id>maven-net-cn</id>
# <name>Maven China Mirror</name>
# <url>http://maven.net.cn/content/groups/public/</url>
# <releases>
# <enabled>true</enabled>
# </releases>
# <snapshots>
# <enabled>false</enabled>
# </snapshots>
# </repository>
# <pluginRepository>
# <id>maven-net-cn</id>
# <name>Maven China Mirror</name>
# <url>http://maven.net.cn/content/groups/public/</url>
# <releases>
# <enabled>true</enabled>
# </releases>
# <snapshots>
# <enabled>false</enabled>
# </snapshots>
# </pluginRepository>
<repositories>的配置,你可以在它下面添加多個(gè)<repository> ,每個(gè)<repository>都有它唯一的ID,一個(gè)描述性的name,以及最重要的,遠程倉庫的url。此外,<releases><enabled>true</enabled></releases>告訴 Maven可以從這個(gè)倉庫下載releases版本的構件,而<snapshots><enabled>false</enabled></snapshots> 告訴Maven不要從這個(gè)倉庫下載snapshot版本的構件。禁止從公共倉庫下載snapshot構件是推薦的做法,因為這些構件不穩定,且不受你控制,你應該避免使用。當然,如果你想使用局域網(wǎng)內組織內部的倉庫,你可以激活snapshot的支持。
關(guān)于<repositories>的更詳細的配置及相關(guān)解釋?zhuān)瑓⒖迹篽ttp://www.sonatype.com/books /maven-book/reference_zh/apas02s08.html。
至于<pluginRepositories>,這是配置Maven從什么地方下載插件構件(Maven的所有實(shí)際行為都由其插件完成)。該元素的內部配置和<repository>完全一樣,不再解釋。
8.關(guān)于setting.xml
settings.xml對于maven來(lái)說(shuō)相當于全局性的配置,用于所有的項目。在maven2中存在兩個(gè)settings.xml,一個(gè)位于maven2的安裝目錄conf下面,作為全局性配置。對于團隊設置,保持一致的定義是關(guān)鍵,所以maven2/conf下面的settings.xml就作為團隊共同的配置文件。保證所有的團隊成員都擁有相同的配置。當然對于每個(gè)成員,都需要特殊的自定義設置,如用戶(hù)信息,所以另外一個(gè)settings.xml就作為本地配置
默認的倉庫地址在超級pom中,我可以找到這個(gè)文件:${M2_HOME}/lib/maven-2.0.10-uber.jar ,打開(kāi)該文件,能找到超級POM:\org\apache\maven\project\pom-4.0.0.xml ,它是所有Maven POM的父POM,所有Maven項目繼承該配置,你可以在這個(gè)POM中發(fā)現如下配置:
1 <repositories>
2 <repository>
3 <id>central</id>
4 <name>Maven Repository Switchboard</name>
5 <layout>default</layout>
6 <url>http://repo1.maven.org/maven2</url>
7 <snapshots>
8 <enabled>false</enabled>
9 </snapshots>
10 </repository>
11 </repositories>
可以在pom文件或者setting文件中覆蓋這個(gè)選項。
9.引入sun包,比如servlet,jdbc等
你必須為所有 Sun Microsystems 維護的 J2EE API 重復同樣的過(guò)程,包括 JNDI, JDBC, Servlet, JSP, JTA, 以及其它。幸運的是,有一種更簡(jiǎn)單的方法來(lái)下載所有這些類(lèi)庫并安裝到本地倉庫 —— Apache Geronimo 的獨立的開(kāi)源實(shí)現。
添加像 JSP API 或者 Servlet API 這樣的依賴(lài)現在很簡(jiǎn)單明了了,不再需要你從 web 站點(diǎn)手工下載 JAR 文件然后再安裝到本地倉庫。 關(guān)鍵是你必須知道去哪里找,使用什么 groupId, artifactId, 和 version 來(lái)引用恰當的 Apache Geronimo 實(shí)現。給 pom.xml 添加如下的依賴(lài)元素以添加對 Servlet 規格說(shuō)明 API 的依賴(lài)。.
Example 5.7. 添加 Servlet 2.4 規格說(shuō)明作為依賴(lài)
<project>
[...]
<dependencies>
[...]
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-servlet_2.4_spec</artifactId>
<version>1.1.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
[...]
</project>
所有 Apache Geronimo 規格說(shuō)明的實(shí)現的 groupId 都是 org.apache.geronimo.specs 。這個(gè) artifactId 包含了你熟悉的規格說(shuō)明的版本號;例如,如果你要引入 Servlet 2.3 規格說(shuō)明,你將使用的 artifactId 是 geronimo-servlet_2.3_spec ,如果你想要引入 Servlet 2.4 規格說(shuō)明,那么你的 artifactId 將會(huì )是 geronimo-servlet_2.4_spec 。
10. SNAPSHOT版本、LATEST 和 RELEASE 版本
如果一個(gè)版本包含字符串“SNAPSHOT”,Maven就會(huì )在安裝或發(fā)布這個(gè)組件的時(shí)候將該符號展開(kāi)為一個(gè)日期和時(shí)間值,轉換為UTC(協(xié)調世界時(shí))。例如,如果你的項目有個(gè)版本為“1.0-SNAPSHOT”并且你將這個(gè)項目的構件部署到了一個(gè)Maven倉庫,如果你在UTC2008年2月7號下午 11:08部署了這個(gè)版本,Maven就會(huì )將這個(gè)版本展開(kāi)成“1.0-20080207-230803-1”。
當你依賴(lài)于一個(gè)插件或一個(gè)依賴(lài),你可以使用特殊的版本值LATEST或者RELEASE。LATEST是指某個(gè)特定構件最新的發(fā)布版或者快照版 (snapshot),最近被部署到某個(gè)特定倉庫的構件。RELEASE是指倉庫中最后的一個(gè)非快照版本。
11.使用Nexus管理倉庫
倉庫管理器有兩個(gè)服務(wù)的目的:首先它的角色是一個(gè)高度可配置得介于你的組織與公開(kāi)Maven倉庫之間的代理,其次他為你的組織提供了一個(gè)可部署你組織內部生成的構建的地方。
優(yōu)點(diǎn):1.節省時(shí)間和帶寬。2.提供一種控制Maven下載的機制。3.內部的統一依賴(lài)
組:
Nexus包含排序好的倉庫組,他們能讓你通過(guò)一個(gè)單獨的URL暴露一系列的倉庫。通常會(huì )有兩個(gè)默認的組:Public Respositories組和Public Snapshot Repositorries。這樣不需要知道來(lái)自哪個(gè)特定的倉庫,只需要能夠瀏覽公共倉庫組就可以了。
要使用Nexus,需要配置Maven去檢查Nexus而非公共的倉庫,為此,需要編輯在你的.m2/setting.xml文件中的mirror配置,

這樣配置以后,Maven會(huì )從本地的Nexus安裝查閱,而非去外面查閱中央Maven倉庫,如果對Nexus有一個(gè)構件請求,本地的Nexus安裝會(huì )提供這個(gè)構件,如果Nexus沒(méi)有這個(gè)構件,Nexus會(huì )從遠程倉庫下載,然后添加至遠程倉庫的本地鏡像。
配置為從本地庫下載:(參考1)
添加新的倉庫:
在添加所有的地址包括快照版都請求向Nexus后,有可能會(huì )照成一些依賴(lài)不能下載。比如Apache Shindig,即使他的pom.xml種定義了一個(gè)倉庫區獲取構建,并且指向了http://google-caja.googlecode.com/svn/maven,但是,由于我們配置了所有請求都向公共組,Nexus不會(huì )從一個(gè)她=它不知道的倉庫中區獲取構件。這有兩個(gè)方法:1.將所有請求改為central請求,不讓Nexus public組mirrorof所有的倉庫。2.添加新的倉庫
聯(lián)系客服