maven實戰(一)簡單mvn構建項目詳解

創建簡單工程

**mvn archetype:generate 
-DgroupId=org.sonatype.mavenbook.ch03 
-DartifactId=simple 
-DpackageName=org.sonatype.mavenbook**

archetype:create 在maven 3.0.5中已經捨棄,使用generate替代

相關mvn命令

archetype:generate:archetype被定義爲“一個原始的模型或者類型,在它之後其它類似的東西與之匹配;一個*原型(prototype)”,Maven有許多可用的archetype,從生成一個簡單的Swing應用,到一個複雜的Web應用。本章我們用最基本的archetype來創建一個入門項目的骨架。這個插件的前綴是“archetype”,目標爲“generate”。
-Dname=value:使用 -D 屬性這樣的形式 1 ,類似於你通過命令行向Java虛擬機傳遞系統屬性,例如-DgroupId是給groupId設置值,-DartifactId是給artifactId設置值。
運行以上mvn命令後已經生成了一個項目,看一下Maven在simple目錄下創建的目錄結構:
simple/
simple/pom.xml
simple/src
src/main
src/main/java/
simple/target

簡單構建

mvn install:

想要構建打包這個應用,在包含 pom.xml 的目錄下運行mvn install,會下載項目中所有依賴,並在target目錄下生成所有編譯後的文件,產生一個jar包(默認打包方式是jar包)。

mvn help:effective-pom:

當Maven運行的時候,它是根據項目的 pom.xml 裏設置的組合來運行的,一個最上級的POM定義了Maven的安裝目錄,在這個目錄中全局的默認值被定義了,(可能)還有一些用戶定義的設置。想要看這個“有效的(effective)”POM,或者說Maven真正運行根據的POM。在目標項目的基礎目錄(pom同級目錄)下跑下面的命令,可以看到當前項目最詳細的maven配置文件。

maven核心概念

1.Maven插件和目標 (Plugins and Goals)

Archetype插件create 目標。Maven第二次運行是一個生命週期階段– install 。爲了運行單個的Maven插件目標,我們使用mvn archetype:create這樣的語法,這裏 archetype 是一個插件標識create 目標標識。當Maven運行一個插件目標,它向標準輸出打印出插件標識和目標標識。

Maven插件(Plugins):一個Maven插件是一個單個或者多個目標的集合

Maven插件的例子有一些簡單但核心的插件,像Jar插件,它包含了一組創建JAR文件的目標,Compiler插件,它包含了一組編譯源代碼和測試代碼的目標,或者Surefire插件,它包含一組運行單元測試和生成測試報告的目標。而其它的,更有專門的插件包括:Hibernate3插件,用來集成流行的持久化框架Hibernate,JRuby插件,它讓你能夠讓運行ruby稱爲Maven構建的一部分或者用Ruby來編寫Maven插件。Maven也提供了自定義插件的能力。一個定製的插件可以用Java編寫,或者用一些其它的語言如Ant,Groovy,beanshell和之前提到的Ruby。

目標(Goals):一個目標是一個明確的任務

一個目標是一個明確的任務,它可以作爲單獨的目標運行,或者作爲一個大的構建的一部分和其它目標一起運行。一個目標是Maven中的一個“工作單元(unit of work)”。目標的例子包括Compiler插件中的 compile 目標,它用來編譯項目中的所有源文件,或者Surefire插件中的 test 目標,用來運行單元測試。目標通過配置屬性進行配置,以用來定製行爲
注意:當提到一個插件目標的時候,我們常常用速記符號: pluginId:goalId 。例如,當提到Archetype插件的create目標的時候,我們寫成 archetype:create 。
目標定義了一些參數,這些參數可以定義一些明智的默認值。在 archetype:create 這個例子中,我們並沒有在命令行中指定這個目標創建什麼類型的archetype,我們簡單的傳入一個 groupId 和一個 artifactId 。這是我們對於約定優於配置(convention overconfiguration)的第一筆。這裏 create 目標的約定,或者默認值,是創建一個簡單的項
目,叫做Quickstart。 create 目標定義了一個配置屬性archetypeArtifactId ,它有一個默認值爲 maven-archetype-quickstart 。Quickstart archetype生成了一個最小項目的軀殼,包括一個POM和一個類。Archetype插件比第一個例子中的樣子強大得多,但是這是一個快速開始新項目的不錯的方法。在本書的後面,我們將會讓你看到Archetype插件可以用來生成複雜如web應用的項目,以及你如何能夠使用Archetype插件來定義你自己項目的集合。
Maven的核心對你項目構建中特定的任務幾乎毫無所知。就它本身來說,Maven不知道如何編譯你的代碼,它甚至不知道如何製作一個JAR文件,它把所有這些任務代理給了Maven插件,像Compiler插件和Jar插件,它們在需要的時候被下載下來並且定時的從Maven中央倉庫更新。當你下載Maven的時候,你得到的是一個包含了基本軀殼的Maven核心,它知道如何解析命令行,管理classpath,解析POM文件,在需要的時候下載Maven插件。通過保持Compiler插件和Maven核心分離,並且提供更新機制,用戶很容易能使用編譯器最新的版本。通過這種方式,Maven插件提供了通用構建邏輯的全局重用性,有不會在構建週期中定義編譯任務,有使用了所有Maven用戶共享的Compiler插件。

2.maven生命週期 (Lifecycle)

生命週期是包含在一個項目構建中的一系列有序階段

maven支持許多不同的生命週期,但是最常用的生命週期是默認的Maven生命週期,這個生命週期中一開始的一個階段是驗證項目的基本完整性,最後的一個階段是把一個項目發佈成產品。生命週期的階段被特地留得含糊,單獨的定義爲驗證(validation),測試(testing),或者發佈(deployment),而他們對不同項目來說意味着不同的事情例如,打包(package)這個階段在一個項目裏生成一個JAR,它也就意味着“將一個項目打成一個jar”,而在另外一個項目裏,打包這個階段可能生成一個WAR文件。

生命週期圖

這裏寫圖片描述
這個生命週期能讓開發人員從一個Maven項目跳到另外一個Maven項目,而不用知道太多每個項目構建的細節。如果你能夠構建一個Maven項目,那麼你就能構建所有的Maven項目。
生命週期將會有文來詳細闡述,此處暫略過。

3.Maven座標 (Coordinates)

一個項目的 groupId:artifactId:version 使之成爲一個獨一無二的項目

(1)maven座標構成:

Archetype插件通過名字爲 pom.xml 的文件創建了一個項目。這就是項目對象模型(POM),一個項目的聲明性描述。當Maven運行一個目標的時候,每個目標都會訪問定義在項目POM裏的信息。當 jar:jar 目標需要創建一個JAR文件的時候,它通過觀察POM來找出這個Jar文件的名字。當 compiler:compile 任務編譯Java源代碼爲字節碼的時候,它通過觀察POM來看是否有編譯目標的參數。目標在POM的上下文中運行。目標是我們希望針對項目運行的動作,而項目是通過POM定義的。POM爲項目命名,提供了項目的一組唯一標識符(座標),並且通過依賴(dependencies) ,父 (parents) 和先決條件(prerequisite) 來定義和其它項目的關係。POM也可以自定義插件行爲,提供項目相關的社區和開發人員的信息。
Maven座標定義了一組標識,它們可以用來唯一標識一個項目,一個依賴,或者MavenPOM裏的一個插件。

(2)maven座標用處:maven中的項目可以通過座標使用特定構件的依賴

在其它“Maven化”項目構成的巨大空間中,的這四個元素是定位和使用某個特定項目的關鍵因素。Maven倉庫(repositories)(公共的,私有的,和本地的)是通過這些標識符來組織的當一個項目被安裝到本地的Maven倉庫,它立刻能被任何其它的項目所使用。而我們所需要做的只是,在其它項目用使用Maven的唯一座標來加入對這個特定構件的依賴

4.Maven倉庫(Repositories)

maven公有中央倉庫

當你第一次運行Maven的時候,你會注意到Maven從一個遠程的Maven倉庫下載了許多文件。如果這個簡單的項目是你第一次運行Maven,那麼當觸發resources:resource目標的時候,它首先會做的事情是去下載最新版本的Resources插件。在Maven中,構件和插件是在它們被需要的時候從遠程的倉庫取來的。初始的Maven下載包的大小相當的小(1.8兆),其中一個原因是事實上這個初始Maven不包括很多插件。它只包含了幾近赤裸的最少值,而在需要的時候再從遠程倉庫去取。Maven自帶了一個用來下載Maven核心插件和依賴的遠程倉庫地址(http://repo1.maven.org/maven2)。

maven定製倉庫

項目依賴於一些既不免費也不公開的包。在這種情況下,你需要要麼在你組織的網絡裏安裝一個定製的倉庫,要麼手動的安裝這些依賴。默認的遠程倉庫可以被替換,或者增加一個你組織維護的自定義Maven倉庫的引用。有許多現成的項目允許組織管理和維護公共Maven倉庫的鏡像。

maven本地倉庫

mvn install項目的構件安裝到你的本地倉庫

Maven從遠程倉庫下載構件和插件到你本機上,存儲在你的本地Maven倉庫裏。一旦Maven已經從遠程倉庫下載了一個構件,它將永遠不需要再下載一次,因爲maven會首先在本地倉庫查找插件,然後纔是其它地方。在Windows XP上,你的本地倉庫很可能在 C:\Documents and Settings\USERNAME.m2\repository ,在Windows Vista上,會是 C:\Users\USERNAME.m2\repository 。在Unix系統上,你的本地倉庫在 ~/.m2/repository 。
當你創建像前一節創建的簡單項目時, install 階段執行一個目標,把你項目的構件安裝到你的本地倉庫。在你的本地倉庫,你應該可以看到我們的簡單項目創建出來的構件。

5.Maven依賴管理 (Dependency Management)

(1)傳遞性依賴(transitive dependencies)

一個複雜的項目將會包含很多依賴,也有可能包含依賴於其它構件的依賴。這是Maven最強大的特徵之一,它支持了傳遞性依賴(transitive dependencies)。假如你的項目依賴於一個庫,而這個庫又依賴於五個或者十個其它的庫(就像Spring或者Hibernate那樣)。你不必找出所有這些依賴然後把它們寫在你的 pom.xml 裏,你只需要加上你直接依賴的那些庫,Maven會隱式的把這些庫間接依賴的庫也加入到你的項目中。Maven也會處理這些依賴中的衝突,同時能讓你自定義默認行爲,或者排除一些特定的傳遞性依賴。
當你把項目的構件安裝到本地倉庫時,你會發現在和JAR文件同一目錄下,Maven發佈了一個稍微修改過的 pom.xml 的版本。存儲POM文件在倉庫裏提供給其它項目了該項目的信息,其中最重要的就是它有哪些依賴。如果項目B依賴於項目A,那麼它也依賴於項目A的依賴。當Maven通過一組Maven座標來處理依賴構件的時候,它也會獲取POM,通依賴的POM來尋找傳遞性依賴。那些傳遞性依賴就會被添加到當前項目的依賴列表中。在Maven中一個依賴不僅僅是一個JAR。它是一個POM文件,這個POM可能也聲明瞭對其它構件的依賴。這些依賴的依賴叫做傳遞性依賴,Maven倉庫不僅僅存貯二進制文件,也存儲了這些構建的元數據(metadata),才使傳遞性依賴成爲可能。

依賴範圍(dependency scope)

Simple項目的 pom.xml 包含了一個依賴—— junit:junit:jar:3.8.1 ——範圍是 test 。當一個依賴的範圍是 test 的時候,說明它在Compiler插件運行 compile 目標的時候是不可用的。它只有在運行compiler:testCompile 和 surefire:test 目標的時候纔會被加入到classpath中。

scope

compile:缺省值,適用於所有階段,會隨着項目一起發佈
provided:類似compile,期望JDK、容器或使用者會提供這個依賴。如servlet.jar。
runtime:重點內容,只在運行時**使用,如JDBC驅動,適用運行和測試階段。
test:重點內容,只在測試時使用,用於編譯和運行測試代碼不會隨項目發佈
system,類似provided,需要顯式提供包含依賴的jarMaven不會在Repository中查找它。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章