Maven 的一些基本概念

Maven 是一種用來管理 Java 項(xiàng)目的工具,它處理的是一個(gè)具體項(xiàng)目所涉及的各種任務(wù)浩螺,如編譯、測試仍侥、打包要出、文檔以及分發(fā)。
Maven 包括一下幾個(gè)部分:

  • 一組用于處理依賴管理农渊、目錄結(jié)構(gòu)以及構(gòu)建工作流的約定患蹂。
  • 一個(gè)用于項(xiàng)目配置的 XML Schema:項(xiàng)目對象模型(Project Object Model),簡稱 POM砸紊。
  • 一個(gè)委托外部組件來執(zhí)行項(xiàng)目任務(wù)的插件架構(gòu)传于。

POM 文件大綱

<project>
  <groupId></groupId>
  <!-- 唯一地第一個(gè) Maven 項(xiàng)目的值 -->
  <artifactId></artifactId>
  <version></version>
  <!-- 該項(xiàng)目所產(chǎn)生的構(gòu)建類型,默認(rèn)值是 jar -->
  <packaging></packaging>
  <!-- 在 POM 中所引用的符號 -->
  <properties></properties>
  <!-- 構(gòu)建當(dāng)前項(xiàng)目所需要的其他 Maven 項(xiàng)目 -->
  <dependencies></dependencies>
  <!-- 構(gòu)建該項(xiàng)目所需要執(zhí)行的任務(wù)的配置 -->
  <build></build>
  <!-- 為不同的用例自定義 POM 的命名的配置 -->
  <profiles></profiles>
</project>

Maven 構(gòu)件

任何可以被 Maven 坐標(biāo)系統(tǒng)唯一標(biāo)識的對象都是一個(gè) Maven 構(gòu)件醉顽。大多數(shù)情況下沼溜,構(gòu)件是構(gòu)建 Maven 項(xiàng)目所生成的文件,如 JAR游添。但是系草,只包含其他 POM 使用的定義的 POM 文件也是 Maven 構(gòu)件。

Maven 構(gòu)件類型由<packaging>元素制定唆涝,最常用的值是pom找都、jarwar以及 maven-plugin廊酣。

GAV 坐標(biāo)

POM 定義了 5 種稱為坐標(biāo)的元素能耻,用于標(biāo)識 Maven 構(gòu)件。GAV 是指必須始終指定的 3 個(gè)坐標(biāo):<groupId> 亡驰、<artifactID> 以及 <version> 晓猛。

  • <groupId> :項(xiàng)目或者項(xiàng)目組的全局唯一標(biāo)識符,通常是 Java 源代碼種使用的全局限定包名隐解。
  • <artifactId> :用于標(biāo)示和某個(gè) <groupId> 相關(guān)的不同的構(gòu)件鞍帝。
  • <type> :和項(xiàng)目相關(guān)的主要構(gòu)件類型诫睬,默認(rèn)值是 jar煞茫。
  • <version>:標(biāo)識構(gòu)件的版本。
  • <classifier>:用于區(qū)分屬于相同的 POM 但是卻被以不同的方式構(gòu)建的構(gòu)件摄凡。

完整的坐標(biāo)表達(dá)式:artifactId:groupId:packaging:version:classifier

POM 文件的用例

可以通過以下方式來使用 POM 文件:

  • 默認(rèn)的 - 用于構(gòu)建一個(gè)構(gòu)件
  • 父 POM - 提供一個(gè)由子項(xiàng)目繼承的單個(gè)配置信息源续徽,聲明這個(gè) POM 文件作為他們的parent元素的值。
  • 聚合器 - 用于構(gòu)建聲明為 <modules> 的項(xiàng)目亲澡,這些子項(xiàng)目位于其當(dāng)前聚合器項(xiàng)目的文件夾中钦扭,每個(gè)都包含有它自己的 POM 文件。

作為父 POM 或者聚合器的 POM 文件的 <packaging> 元素的值應(yīng)該是 pom床绪。一個(gè) POM 文件可能同時(shí)提供兩項(xiàng)功能客情。

構(gòu)建的生命周期

Maven 構(gòu)件的生命周期是一個(gè)明確定義的用于構(gòu)建和分發(fā)的過程其弊。有 3 個(gè)內(nèi)置的構(gòu)建生命周期:cleandefaultsite膀斋。

一個(gè)構(gòu)建生命周期由一系列的階段組成:

  • validate 檢查項(xiàng)目是否正確梭伐,所有必須的信息是否已經(jīng)就緒。
  • process-sources 處理源代碼仰担,如過濾任何值糊识。
  • compile 編譯項(xiàng)目的源代碼。
  • process-test-resources 復(fù)制并處理資源刀測試目標(biāo)目錄中摔蓝。
  • test-compile 將測試源代碼編譯到測試目標(biāo)目錄中赂苗。
  • test 使用合適的單元測試框架測試編譯的源代碼。
  • package 將編譯的代碼打包為它可分發(fā)的格式贮尉,如 JAR拌滋。
  • integration-test 處理并將軟件包部署到一個(gè)可以運(yùn)行集成測試的環(huán)境中。
  • verify 運(yùn)行任何的檢查以驗(yàn)證軟件包是否有效猜谚,并且符合質(zhì)量標(biāo)準(zhǔn)鸠真。
  • install 將軟件包安裝到本地存儲庫中,在那里其他本地構(gòu)建項(xiàng)目可以將它引用為依賴龄毡。
  • deploy 將最終的構(gòu)件上傳到遠(yuǎn)程存儲庫吠卷,以與其他開發(fā)人員和項(xiàng)目共享。

依賴

項(xiàng)目依賴是指編譯和執(zhí)行它所需要的外部構(gòu)件沦零,Maven 中的依賴在 <dependency> 中聲明祭隔,GAV 坐標(biāo)是必不可少的。typescope 元素對于那些值不是 jarcompile 的依賴來說也是必不可少的路操。

<scope> 元素可以具有以下值:

  • compile 編譯和執(zhí)行需要的默認(rèn)值疾渴。
  • runtime 只有執(zhí)行需要。
  • optional 不會被其他引用這個(gè)項(xiàng)目所產(chǎn)生的構(gòu)件項(xiàng)目視為傳遞依賴屯仗。
  • provided 不會被包含在由這個(gè) POM 產(chǎn)生的 WAR 文件的 WEB_INF/lib 目錄中搞坝。
  • test 只有編譯和測試的執(zhí)行需要。
  • import 把外部 POM 的 <dependencyManagement> 元素的內(nèi)容導(dǎo)入到當(dāng)前 POM 的 <dependencyManagement> 元素中魁袜。

依賴管理

POM 的 <dependencyManagement> 元素可以包含被其他項(xiàng)目使用的<dependency> 聲明桩撮,這樣的 POM 子項(xiàng)目將會自動繼承這些聲明。

引用了 <dependencyManagement> 元素的項(xiàng)目可以使用它所聲明的依賴峰弹,而不需要指定它們的<version> 坐標(biāo)店量,如果 <dependencyManagement> 中的 <version> 有所改變,則引用它的 POM 也會改變鞠呈。

插件

雖然 Maven 協(xié)調(diào)了所有構(gòu)建生命周期階段的執(zhí)行融师,但是它并沒有直接實(shí)現(xiàn)他們,相反蚁吝,Maven 將它們委托給了插件旱爆,這些插件是 maven-plugin 類型的構(gòu)件(打包為 JAR 文件)舀射。

Apache Maven 項(xiàng)目為標(biāo)準(zhǔn)構(gòu)件生命周期所定義的任務(wù)都提供了插件,更多是由第三方產(chǎn)生的怀伦,用于處理各種自定義的任務(wù)后控。

插件可能擁有多個(gè)內(nèi)部步驟或者目標(biāo),也可以被單獨(dú)調(diào)用空镜。例如在一個(gè) JAR 項(xiàng)目中浩淘,默認(rèn)的構(gòu)建生命周期由 maven-jar-plugin 處理,其將構(gòu)建的各個(gè)階段映射到了它自己的以及其他插件的目標(biāo)中吴攒。

插件管理

<pluginManagement>聲明了其他 POM 可以使用的信息张抄,但是這只適用于子 POM,因?yàn)閷τ诓寮碚f洼怔,沒有導(dǎo)入聲明署惯。

在聲明由 Maven 項(xiàng)目生成的插件時(shí),可以省略 groupId(org.apache.maven.plugins)镣隶。maven 開頭的 artifactId 僅供 Maven 項(xiàng)目使用极谊。

配置文件

配置文件(在 <profiles> 中定義)是一組自定義的 POM 元素,可以通過自動或手動啟用來改變 POM 的行為安岂。

存儲庫

Maven 的構(gòu)件存儲庫可能是遠(yuǎn)程的轻猖,也可能是本地的。

  • 遠(yuǎn)程存儲庫是一個(gè) Maven 從其下載 POM 文件所引用的依賴服務(wù)域那。
  • 本地存儲庫是一個(gè)本地的目錄咙边,其包含從遠(yuǎn)程存儲庫下載的構(gòu)件,以及在本地機(jī)器上構(gòu)建并安裝的構(gòu)件次员。通常目錄為 ~/.m2/repository 败许,Maven 存儲庫的物理目錄結(jié)構(gòu)使用 GAV 坐標(biāo)。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末淑蔚,一起剝皮案震驚了整個(gè)濱河市市殷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌刹衫,老刑警劉巖醋寝,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異绪妹,居然都是意外死亡甥桂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門邮旷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蝇摸,你說我怎么就攤上這事婶肩“煜荩” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵律歼,是天一觀的道長民镜。 經(jīng)常有香客問我,道長险毁,這世上最難降的妖魔是什么制圈? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮畔况,結(jié)果婚禮上鲸鹦,老公的妹妹穿的比我還像新娘。我一直安慰自己跷跪,他們只是感情好馋嗜,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吵瞻,像睡著了一般葛菇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上橡羞,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天眯停,我揣著相機(jī)與錄音,去河邊找鬼卿泽。 笑死庵朝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的又厉。 我是一名探鬼主播九府,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼覆致!你這毒婦竟也來了侄旬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎闲擦,沒想到半個(gè)月后嘴瓤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡汰蜘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了之宿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片族操。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出色难,到底是詐尸還是另有隱情泼舱,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布枷莉,位于F島的核電站娇昙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏笤妙。R本人自食惡果不足惜冒掌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蹲盘。 院中可真熱鬧股毫,春花似錦、人聲如沸辜限。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽薄嫡。三九已至氧急,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間毫深,已是汗流浹背吩坝。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哑蔫,地道東北人钉寝。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像闸迷,于是被迫代替她去往敵國和親嵌纲。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1 依賴 1.1 denpendency包含的元素 1.2 依賴范圍 scope java程序有三種classpa...
    醬油和醋閱讀 1,068評論 1 0
  • Maven是基于項(xiàng)目對象模型(POM)腥沽,可以通過一小段描述信息來管理項(xiàng)目的構(gòu)建逮走、報(bào)告和文檔的軟件項(xiàng)目管理工具。 安...
    李小西033閱讀 260評論 0 0
  • 所有的知識來源于Maven官方網(wǎng)站:https://maven.apache.org/;Maven開發(fā)者搭建的官方...
    Carter強(qiáng)閱讀 298評論 0 0
  • Maven的基本概念 [toc] Maven可以幫助我們做什么 如果只是一個(gè)簡單的項(xiàng)目(例如只有一個(gè)Java文件的...
    qingshuiting閱讀 828評論 0 1
  • Maven的基本了解 什么是Maven今阳? Maven就是Apache下的一個(gè)開源項(xiàng)目师溅。它是用純java開發(fā)的。是一...
    Bcome閱讀 2,781評論 0 7