標籤:maven
Maven是什麼Maven是優秀的構建工具: 構建是指項目的清理、編譯、測試到產生構建報告、再到打包和部署的過程,使用java原生命令或者在IDE中操作,只能執行構建中的某一步操作,而Maven能協助我們自動化的構建,我們甚至只需要一個命令就能執行上訴構建的所有操作。 maven是跨平台的,意味著你不再受平台約束。
Maven是一個依賴管理工具和項目資訊管理工具: Maven能幫我們管理項目中要使用的構件,我們不再為找不到jar包或者版本衝突而痛苦。它提供了中央倉庫,能幫我們自動下載構件。它通過一個座標系統準確地定位每一個構件(artifact),也就是通過一組座標Maven能夠找到任何一個Java類庫(如jar檔案),於是我們可以藉助它來有序地管理依賴。 Maven還能協助我們管理原本分散在項目中各個角落的項目資訊,包括項目描述、開發人員列表、版本控制系統地址、許可證、缺陷管理系統地址等。典型的項目會有開發環境、預發環境和線上環境,Maven還能對不同環境所依賴的配置進行管理,使我們的項目能在不同的環境下靈活的切換。
Maven追求的兩個目標:約定優於配置、高可擴充性: 約定優於配置:不同於Make、Ant等傳統構建工具,Maven制定了一系列的規則,來規範和約束項目的組織圖和構建過程,通過這種方式降低了Maven的學習成本和使用成本。 高可擴充性:Maven在大多數情況下的使用提供了預設的實現,當我們需要更加精細控制時,我們可以配置已有外掛程式,或者添加新的外掛程式,類似我們還可以定義自己的倉庫、archetype等等。
Maven的安裝與配置 在此文中不再贅述,請看專欄內的這篇文章:http://blog.csdn.net/troy__/article/details/38826553 。
Maven使用入門 我們通過手動寫一個HelloWorld的Maven程式來看看Maven的基本組成。 在此文中不再贅述,詳細內容請看專欄內這篇文章:http://blog.csdn.net/troy__/article/details/38851903 。
Maven座標與依賴 座標是Maven實現依賴管理功能的基礎,Maven通過為任何一個構件定義一個唯一的標示來確定該構件的歸屬及版本。
依賴管理要解決三個主要問題:1. 構件從何來? 2. 怎麼解決構件衝突? 3. 如何管理項目持續的版本? 對於第一個問題,Maven定義了倉庫,將不同來源的構件都放在倉庫中集中儲存。關於倉庫,我們下一節將詳細講述。 對於第二個問題,通過分析可以知道,構件衝突主要是由於傳遞性依賴引起的,即類似於同時出現A->B->C,又出現A->C的情況。Maven通過定義一系列的規則解決依賴衝突的問題,簡單來說第一原則是:路徑最短者優先,第二原則:第一聲明者優先,即根據POM中依賴聲明的順序決定誰會被解析使用,順序最靠前的那個依賴優先。 對於第三個問題,通過版本的定義,我們可以對軟體持續的開發和發布定義狀態。maven定義了快照版本SNAPSHOT,快照版本主要有兩個作用。(1). 用於區分穩定與不穩定的構件:那麼發布版本就是穩定的,快照版本就是不穩定的。(2). 用於避免由於版本升級導致不停地升級版本號碼,造成版本號碼的泛濫的問題。(這就是"快照"這個詞的含義)。
Maven的依賴管理還提供了對依賴構件更加精細的控制的能力1. 依賴範圍 Maven項目在執行編譯、測試、運行時執行的是三套不同的classpath,我們在引入依賴的時候,可以限制其依賴範圍,這樣可以避免其對其他環境造成汙染。2. 可選依賴 可以定製自身項目的某些依賴不會被得以傳遞。3. 排除依賴 可以排除掉指定的傳遞性依賴,通常是由於這個傳遞性依賴的版本問題需要替換掉,排除後直接在本項目中聲明某個版本的該構件即可。 除此之外,Maven還提供了幾個工具用於分析當前項目用到的依賴,便於我們對其使用進行最佳化。關於Maven傳遞和依賴的詳細內容,可以查看專欄內的另一篇文章:http://blog.csdn.net/troy__/article/details/38903737。
Maven倉庫 Maven倉庫解決了構件從哪來的問題。下面是Maven倉庫的組織圖:
可以把Maven的倉庫想象成一棵倒立的樹,而我們的終端就是葉子節點,中央倉庫則為根,私服則是樹中間的節點,我們的從葉子節點一步步往上去尋找項目所需的構件,先是本地倉庫,然後私服,再是中央倉庫。設立的私服的目的主要是:提高相應速度、節省頻寬,
內部構件共用。 在實際工作中,我們都會搭建私服,尋找和部署構件,私服配置代碼一般與具體項目無關,所以我們都放在settings.xml中,下面展示一段典型的倉庫配置代碼:
<servers> <server> <id>release</id> <username>releaseAdmin</username> <password>123456</password> </server> <server> <id>snapshots</id> <username>snapshotsAdmin</username> <password>123456</password> </server> </servers> <mirrors> <mirror> <id>jymirror</id> <mirrorOf>central</mirrorOf> <name>jiangye mirror</name> <url>http://mvnrepo.jiang.ye.com/mvn/repository</url> </mirror> <mirror> <id>jymirror-snapshots</id> <mirrorOf>snapshots</mirrorOf> <name>jiangye mirror snapshots</name> <url>http://mvnrepo.jiang.ye.com/mvn/repository</url> </mirror> </mirrors> <profiles> <profile> <id>nexus</id> <repositories> <repository> <id>central</id> <url>http://mvnrepo.jiang.ye.com/mvn/repository</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>snapshots</id> <url>http://mvnrepo.jiang.ye.com/mvn/repository</url> <releases> <enabled>false</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>central</id> <url>http://mvnrepo.jiang.ye.com/mvn/repository</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> <pluginRepository> <id>snapshots</id> <url>http://mvnrepo.jiangye.ye.com/mvn/repository</url> <releases> <enabled>false</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> </pluginRepositories> </profile> </profiles> <activeProfiles> <activeProfile>nexus</activeProfile> </activeProfiles>
上面的代碼定義了構件、外掛程式的倉庫,利用私服替代了遠程倉庫。關於倉庫的詳細內容,請看專欄內的另外一篇文章:http://blog.csdn.net/troy__/article/details/38962277。
生命週期與外掛程式 Maven將整個構建的過程抽象出來定義了一套生命週期。主要包括:清理、主資源檔的處理、主代碼編譯、測試資源的處理、測試代碼的編譯、測試、打包、安裝、部署到遠程倉庫、發布網站等待。 我們可以從命令列調用Maven任務執行相應的生命週期操作,執行某一生命週期時,該周期前面所有周期都將順序執行。Maven為每一個生命週期都綁定在了一個預設的外掛程式目標上,我們可以通過外掛程式的配置來跳過某些周期或者定製化某些周期的行為,這便是外掛程式的作用。例如我們常用的跳過測試的命令列操作:
$mvn install -Dmaven.test.skip=true 除了內建綁定,我們還可以自己選擇將某個外掛程式目標綁定到某個生命週期上,執行一些額外的任務,比如利用maven-source-plugin產生項目的jar檔案。 除此之外,Maven也支援從命令列直接調用一些外掛程式,因為這些外掛程式自身不適合綁定在某個生命週期上,比如maven-help-plugin:descirbe,這是maven協助提示外掛程式。關於生命週期與外掛程式的詳細內容,請看專欄內的另外一篇文章: http://blog.csdn.net/troy__/article/details/39031687。
彙總和繼承 一個項目在實際工作中,通常會根據各種方式將其劃分成多個模組,以獲得更清晰的設計或者靈活性。我們通常會定義一個獨立的POM,讓其他子模組來依賴該pom,這樣我們的構建和依賴管理等行為都可以通過該pom來實現,即化簡了使用,也達到了控制的目的。這種方式被稱為彙總(將多個模組彙總到一個pom上)和繼承(子模組繼承父模組的資訊,包括項目自身資訊及依賴、外掛程式等)。關於彙總和繼承的詳細內容,請查看http://blog.csdn.net/troy__/article/details/39085611 。
使用Nexus建立私服 建立私服的過程在平常使用較少,在此不再贅述,詳細內容請查看http://blog.csdn.net/troy__/article/details/39207531。
使用Maven進行測試 利用Maven來進行專案範圍的單元測試是一種很好的習慣,但是在我周圍的工作中卻使用較少,原因有如下: 1. 所負責的項目切換較快,通常都是在前人的項目上進行開發和維護,因此前面會留下大量的到期的單元測試,要對其進行整理,是件成本很高的事。 2. 相對十分依賴功能的迴歸測試,而非單元測試。 只有在開發新功能時,才會對新添加的功能寫單元測試的代碼。 關於Maven對測試支援的相關內容,請查看http://blog.csdn.net/troy__/article/details/39233529。
使用Maven建立Web應用 在使用Maven建立Web應用時,我們通常會建立一個獨立的模組webapp出來,用以存放與Web密切相關的檔案,如web.xml、各種設定檔、html、jsp、css、JavaScript等等。 通過使用一些容器的maven外掛程式,我們把項目熱部署到容器上,避免我們來回修改檔案導致的打包部署等操作。不過在工作中用的還是很少的,因為一般IDE都有整合容器的外掛程式,我們可以在IDE"點兩下"就能實現熱部署。有需要的朋友,可以查看這篇文章http://blog.csdn.net/troy__/article/details/39298847,瞭解更詳細的內容。
靈活的構建 在實際開發過程中,通常會有所謂的開發環境、測試環境和產品環境,這些環境中的各項配置不盡相同,比如資料庫配置、緩衝配置、RFC配置,那麼項目構建的時候就需要能夠識別所在的環境並使用正確的配置。為此,Maven提供了三大特性:屬性、Profile和資源過濾。 我們將可變的部分利用Maven屬性進行替代,而將Maven屬性定義在Profile中,再在構建時開啟指定Profile即可實現各種環境的靈活切換。 (當下許多公司的"開發平台"、"協作平台"都是基於Maven來實現的。) 瞭解這些知識對於理解項目的開發和構建有很好的協助。關於這一節的詳細內容請看這篇文章:http://blog.csdn.net/troy__/article/details/39347247。
常用的幾個知識點1. 在整合了maven的IDE中直接pom添加依賴,會觸發jar包的更新及引入。2. 我們經常使用命令:
mvn clean eclipse:eclipse -U -DdownloadSources=true,將maven項目轉為eclipse項目,並下載源碼。3. src\main\resources及src\test\resources在預設情況下maven不會幫我們建立,需要我們手動建立,如果需要使用maven屬性,記得要在pom配置資源過濾。
Maven使用總結