maven入門(下)

作者:George Ma
第一篇文章大概的介紹了一下Apache Maven以及它的下載和安裝,并且運行了一個簡單的示例。那么在對maven有了一點接觸后,接下去的一步是要了解maven的核心概念,這樣才能在使用maven的時候游刃有余。
接下來我們介紹下面這幾個核心概念:
POM (Project Object Model)
Maven 插件
Maven 生命周期
Maven 依賴管理
Maven 庫

POM (Project Object Model)
一個項目所有的配置都放置在 POM 文件中:定義項目的類型、名字,管理依賴關系,定制插件的行為等等。比如說,你可以配置 compiler 插件讓它使用 java 1.5 來編譯。
現在看一下第一篇文章中示例的 POM
Xml 代碼
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.helloworld</groupId> <artifactId>helloworld</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>helloworld</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
在 POM 中,groupId, artifactId, packaging, version 叫作 maven 坐標,它能唯一的確定一個項目。有了 maven 坐標,我們就可以用它來指定我們的項目所依賴的其他項目,插件,或者父項目。一般 maven 坐標寫成如下的格式:
groupId:artifactId:packaging:version
像我們的例子就會寫成:
com.mycompany.helloworld: helloworld: jar: 1.0-SNAPSHOT
我們的 helloworld 示例很簡單,但是大項目一般會分成幾個子項目。在這種情況下,每個子項目就會有自己的 POM 文件,然后它們會有一個共同的父項目。這樣只要構建父項目就能夠構建所有的子項目了。子項目的 POM 會繼承父項目的 POM。另外,所有的 POM都繼承了一個 Super-POM。Super-POM 設置了一些默認值,比如在第一篇文章中提到的默認的目錄結構,默認的插件等等,它遵循了慣例優于配置的原則。所以盡管我們的這個 POM 很簡單,但是這只是你看得見的一部分。運行時候的 POM 要復雜的多。 如果你想看到運行時候的 POM 的全部內容的話,可以運行下面的命令:
$mvn help:effective-pom
Maven 插件
第一篇文章中,我們用了 mvn archetype:generate 命令來生成一個項目。那么這里的 archetype:generate 是什么意思呢?archetype 是一個插件的名字,generate是目標(goal)的名字。這個命令的意思是告訴 maven 執行 archetype 插件的 generate 目標。插件目標通常會寫成pluginId:goalId
一個目標是一個工作單元,而插件則是一個或者多個目標的集合。比如說Jar插件,Compiler插件,Surefire插件等。從看名字就能知道,Jar 插件包含建立Jar文件的目標, Compiler 插件包含編譯源代碼和單元測試代碼的目標。Surefire 插件的話,則是運行單元測試。
看到這里,估計你能明白了,mvn 本身不會做太多的事情,它不知道怎么樣編譯或者怎么樣打包。它把構建的任務交給插件去做。插件定義了常用的構建邏輯,能夠被重復利用。這樣做的好處是,一旦插件有了更新,那么所有的 maven 用戶都能得到更新。
Maven 生命周期
上一篇文章中,我們用的第二個命令是:mvn package。這里的 package 是一個maven的生命周期階段 (lifecycle phase )。生命周期指項目的構建過程,它包含了一系列的有序的階段 (phase),而一個階段就是構建過程中的一個步驟。
那么生命周期階段和上面說的插件目標之間是什么關系呢?插件目標可以綁定到生命周期階段上。一個生命周期階段可以綁定多個插件目標。當 maven 在構建過程中逐步的通過每個階段時,會執行該階段所有的插件目標。
maven 能支持不同的生命周期,但是最常用的是默認的Maven生命周期 (default Maven lifecycle )。如果你沒有對它進行任何的插件配置或者定制的話,那么上面的命令 mvn package 會依次執行默認生命周期中直到包括 package 階段前的所有階段的插件目標:
process-resources 階段:resources:resources

compile 階段:compiler:compile

process-classes 階段:(默認無目標)

process-test-resources 階段:resources:testResources

test-compile 階段:compiler:testCompile

test 階段:surefire:test

prepare-package 階段:(默認無目標)

package 階段:jar:jar

Maven 依賴管理
之前我們說過,maven 坐標能夠確定一個項目。換句話說,我們可以用它來解決依賴關系。在 POM 中,依賴關系是在 dependencies 部分中定義的。在上面的 POM 例子中,我們用 dependencies 定義了對于 junit 的依賴:
Xml 代碼
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies>
那這個例子很簡單,但是實際開發中我們會有復雜得多的依賴關系,因為被依賴的 jar 文件會有自己的依賴關系。那么我們是不是需要把那些間接依賴的 jar 文件也都定義在POM中呢?答案是不需要,因為 maven 提供了傳遞依賴的特性。
所謂傳遞依賴是指 maven 會檢查被依賴的 jar 文件,把它的依賴關系納入最終解決的依賴關系鏈中。針對上面的 junit 依賴關系,如果你看一下 maven 的本地庫(我們馬上會解釋 maven 庫)~/.m2/repository/junit/junit/3.8.1/ ,[圖片上傳中。。。(1)]
你會發現 maven 不但下載了 junit-3.8.1.jar,還下載了它的 POM 文件。這樣 maven 就能檢查 junit 的依賴關系,把它所需要的依賴也包括進來。
在 POM 的 dependencies 部分中,scope 決定了依賴關系的適用范圍。我們的例子中 junit 的 scope 是 test,那么它只會在執行 compiler:testCompile and surefire:test 目標的時候才會被加到 classpath 中,在執行 compiler:compile 目標時是拿不到 junit 的。
我們還可以指定 scope 為 provided,意思是 JDK 或者容器會提供所需的jar文件。比如說在做web應用開發的時候,我們在編譯的時候需要 servlet API jar 文件,但是在打包的時候不需要把這個 jar 文件打在 WAR 中,因為servlet容器或者應用服務器會提供的。
scope 的默認值是 compile,即任何時候都會被包含在 classpath 中,在打包的時候也會被包括進去。
Maven
當第一次運行 maven 命令的時候,你需要 Internet 連接,因為它要從網上下載一些文件。那么它從哪里下載呢?它是從 maven 默認的遠程庫(http://repo1.maven.org/maven2) 下載的。這個遠程庫有 maven 的核心插件和可供下載的 jar 文件。
但是不是所有的 jar 文件都是可以從默認的遠程庫下載的,比如說我們自己開發的項目。這個時候,有兩個選擇:要么在公司內部設置定制庫,要么手動下載和安裝所需的jar文件到本地庫。
本地庫是指 maven 下載了插件或者 jar 文件后存放在本地機器上的拷貝。在 Linux 上,它的位置在 ~/.m2/repository,在 Windows XP 上,在 C:\Documents and Settings\username.m2\repository ,在 Windows 7 上,在 C:\Users\username.m2\repository。當 maven 查找需要的 jar 文件時,它會先在本地庫中尋找,只有在找不到的情況下,才會去遠程庫中找。
運行下面的命令能把我們的 helloworld 項目安裝到本地庫:
$mvn install
一旦一個項目被安裝到了本地庫后,你別的項目就可以通過 maven 坐標和這個項目建立依賴關系。比如如果我現在有一個新項目需要用到 helloworld,那么在運行了上面的 mvn install 命令后,我就可以如下所示來建立依賴關系:
Xml 代碼
<dependency> <groupId>com.mycompany.helloworld</groupId> <artifactId>helloworld</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
好了,maven 的核心概念就簡單的介紹到這里。至于在 Eclipse 中如何使用 maven,這個網上很多了,google 一下就行。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,347評論 2 377

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,818評論 18 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,912評論 6 342
  • 1.編寫POM Maven項目的核心文件是pom.xml,POM(Project Objcet Model)項目對...
    zlcook閱讀 5,924評論 7 26
  • 前言什么是 POMQuick Overview POM 常用元素 pom.xml 完整注釋 參考 0 前言 什么是...
    阿父閱讀 12,641評論 1 36
  • 1.好的自我介紹 為什么這份工作非要你來做才適合! 我看到在招聘啟事上,這份工作需要blabla,這和我之前的工...
    phper1021閱讀 261評論 0 0