理解 maven 的核心概念

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

本文以類圖的方式,介紹 maven 核心的 12 個概念及相互之間的關系。

Table of Contents

  • 1 maven管理的目標:工程(Project)
    • 1.1 工程依賴關系
    • 1.2 工程聚合關系
  • 2 maven的核心:生命周期和階段
  • 3 功能實現:插件和Goal
  • 4 倉庫(Repository)
  • 5 小結

1?maven管理的目標:工程(Project)

?

maven是一個軟件工程(Software Project)管理工具。 對于maven來說,一個軟件工程的唯一標識是由開發者(groupId)、生成物(artifactId)、版本(version) 共同決定的。

每個工程都有一個打包類型,可以是jar, war, ear 或 pom。打包類型決定了工程最終產物的類型。 其中pom類型用于構件多模塊工程。

工程之間有兩種關系:依賴和聚合。

1.1?工程依賴關系

依賴關系的管理是maven最為人稱道的地方。一個工程可以依賴多個其他工程, 通過工程的唯一標識(groupId+artifactId+version)可以明確指明依賴的庫及版本,而且能夠處理 依賴關系的傳遞。 maven可以指定依賴的作用范圍(scope),包括以下幾種:

scope編譯期測試期運行期說明
*compileVVV默認scope
test?V?只在測試期依賴,如junit包
providedVV?運行期由容器提供,如servlet-api包
runtime?VV編譯期間不需要直接引用
systemVV?編譯和測試時由本機環境提供

由于依賴關系的傳遞性可能會導致依賴的版本、scope等發生沖突,maven提供了仲裁機制,同時也 允許自己通過配置進行依賴管理。

1.2?工程聚合關系

前面提到pom類型用于于構件多模塊工程,這體現了project之間的一種聚合關系: 將一系列小的模塊聚合成整個產品。

通過聚合后的工程可以同時管理每個相關模塊的構建、清理、文檔等工作。 聚合關系通過在子工程中指定一個pom類型的project作為父project來定義。

2?maven的核心:生命周期和階段

maven將工程(Project)的構建過程理解為不同的生命周期(LifeCycle)和階段(Phase)。 在工程的構建過程中,存在著不同的生命周期,這些生命周期互相獨立,之間也沒有一定的順序關系。 每個生命周期又劃分為不同的階段(Phase)。階段之間有明確的順序關系, 同一生命周期內的階段必須按順序依次執行。

maven內置了三個生命周期,并為每個生命周期內置了一些階段。 下面列舉出maven內置的生命周期及主要的階段:?

  • default:構建(Build)
    1. validate:驗證項目是否正確,所有必需的信息是否可用。
    2. compile:編譯項目中的代碼。
    3. test:用相關的單元測試框架測試編譯后的代碼,這些運行的測試并不會隨項目打包和布署。
    4. package:將編譯后的代碼打包成相應的格式文件,如jar包。
    5. integration-test: 如果需要在一個綜合環境中運行我們的測試,這個階段將會運行和布署項目到該環境中。
    6. verify: 檢查項目的包是否正確和符合要求。
    7. install:將包安裝到本地maven倉庫,可以讓其他項目作為依賴使用該包。
    8. deploy:將包發布到遠程的maven倉庫,并提供給其他開發者使用。
  • clean:清理
    1. pre-clean 準備清理
    2. clean 執行清理工作
    3. post-clean 執行清理后的后續工作
  • site:生成項目文檔和站點
    1. pre-site 準備生成
    2. site 生成項目站點和文檔
    3. post-site 執行生成文檔后的后續工作
    4. site-deploy 發布項目文檔

更詳細的phase說明參考:?http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference

3?功能實現:插件和Goal

Maven中定義的工程周期和階段只是抽象的概念,不涉及具體的功能。 具體的功能由插件(Plugin)實現。一個插件可以實現多個目標(Goal)。

為了解耦插件的功能和工程階段,實現高度的可配置性,maven規定插件只是實現目標的功能, 通過配置來決定在哪個階段執行(Execution)哪些目標操作。 甚至可以把一個Goal綁定到多個Phase,以實現復用。

maven內置了一些默認的插件,并根據不同的工程packing類型在各個phase中默認綁定了一些goal。 下表中列出default生命周期中各階段默認綁定的goal,其中goal按照管理使用pluginname:goalname的方式標記:

PahsePlugin:Goal
process-resourcesresources:resources
compilecompiler:compile
process-test-resourcesresources:testResources
test-compilecompiler:testCompile
testsurefire:test
packageejb:ejb/ejb3:ejb3/jar:jar/par:par/rar:rar/war:war
installinstall:install
deploydeploy:deploy

最后需要說明的是,maven的插件是一種packaging類型為maven-plugin的project, 可以使用maven project的依賴,配置插件等等一切特性。

4?倉庫(Repository)

倉庫主要用于獲取工程依賴的其他工程的生成物,也可用來部署(deploy)maven工程的生成物。 生成物包括各種打包的生成物以及pom文件。

如果有必要,一個工程可以部署到多個倉庫。

倉庫可以分為本地庫(local)和遠程庫(remote)。本地庫通常位于本機的~/.m2/repository文件夾, 遠程庫最常見的是maven中央庫(),此外也會有一些私服庫用于企業內部。

http://repository.jboss.com/maven2/

5?小結

本文梳理了maven的核心概念,整個maven核心概念的全貌如下:

?

概念說明
LifeCycle生命周期,maven內置default,sie,clean三個生命周期
Phase階段,每個生命周期有不同的階段
Plugin插件,實現實際的構建功能
Goal一個插件可以實現多個goal,goal具備具體的功能
Execution通過配置,決定在某個Phase執行哪些Goal
Projectmaven管理的目標:軟件工程,小的工程可以聚合成大工程
PackageType為了便于管理工程,按照構建目標區分成不同的工程類型,如jar,war,ear等
Dependency依賴,project之間存在依賴關系
DependencyScopemaven對依賴定義了不同的作用范圍
Management可以配置一個工程如何管理依賴關系
Repository倉庫,存放包,分為本地庫和遠程庫
Build構建的動作。使用maven管理工程,主要是指定將project構建到某個phase

Author: Holbrook Wong?<holbrook@holbrook.imac>

Date: 2012-12-24 09:20:24 CST

HTML generated by org-mode 6.33x in emacs 23

?

轉自:http://www.cnblogs.com/holbrook/archive/2012/12/24/2830519.html#sec-1.1

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452190.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452190.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452190.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

時間跟蹤圖

事件跟蹤圖實質上是擴充的腳本&#xff0c;可以認為事件跟蹤圖是簡化的UML順序圖。

1088. [SCOI2005]掃雷Mine【網格DP】

Description 相信大家都玩過掃雷的游戲。那是在一個n*m的矩陣里面有一些雷&#xff0c;要你根據一些信息找出雷來。萬圣節到了 &#xff0c;“余”人國流行起了一種簡單的掃雷游戲&#xff0c;這個游戲規則和掃雷一樣&#xff0c;如果某個格子沒有雷&#xff0c;那么它里面的數…

spring data jpa和mybatis的不同

使用spring data JPA和mybatis都是用來訪問數據庫&#xff0c;但他們的分工不同&#xff1a; 1.spring data jpa默認使用hibernate作為ORM實現&#xff0c;是spring 提供的一套jpa接口&#xff0c;使用spring data jpa主要完成一些簡單的增刪改查功能。 2.對于復雜的查詢功能會…

函數式編程很難,這正是你要學習它的原因

很奇怪不是&#xff0c;很少有人每天都使用函數式編程語言。如果你用Scala&#xff0c;Haskell&#xff0c;Erlang&#xff0c;F#或某個Lisp方言來編程&#xff0c;很可能沒有公司會花錢聘你。這個行業里的絕大部分人都是使用像Python&#xff0c;Ruby&#xff0c;Java或C#等面…

函數依賴

設R(U)是一個屬性集U上的關系模式&#xff0c;X和Y是U的子集。若對于R(U)的任意一個可能的關系r&#xff0c;r 中不可能存在兩個元組在X上的屬性值相等&#xff0c; 而在Y上的屬性值不等&#xff0c; 則稱“X函數確定Y”或“Y函數依賴于X”&#xff0c;記作X→Y。 X→Y&#x…

Java面試——線程池

1、類比介紹 假如有一個工廠&#xff0c;工廠里面有10個工人&#xff0c;每個工人同時只能做一件任務。 因此只要當10個工人中有工人是空閑的&#xff0c;來了任務就分配給空閑的工人做&#xff1b; 當10個工人都有任務在做時&#xff0c;如果還來了任務&#xff0c;就把任務進…

C#關鍵字的使用

params object[] 用于函數多參數的定義public static void Write(string format, params object[] arg);explicit 關鍵字用于聲明必須使用強制轉換來調用的用戶定義的類型轉換運算符。 例如&#xff0c;在下面的示例中&#xff0c;此運算符將名為 Fahrenheit 的類轉換為名為 Ce…

maven 中 pom.xml 配置文件標簽說明,dependencyManagement和dependencies區別

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 參考&#xff1a;http://zhaoshijie.iteye.com/blog/2094478http://blog.csdn.net/cpf2016/article/details/45674377 還有一篇轉載文章…

學成在線--17.我的課程

文章目錄一.需求分析二.API接口三.PageHelper1.PageHelper介紹2.添加依賴3.配置pageHelper四.Dao1.mapper 接口2.mapper.xml映射文件3.測試Dao五.Service六.Controller七.前端1.創建course_list.vue2.路由3.定義API方法4.前端視圖course_list.vue詳解1&#xff09;API調用--在視…

碼是數據系統中的基本概念。所謂碼就是能唯一標識實體的屬性或屬性集合&#xff0c;他是整個實體集的性質&#xff0c;而不是單個實體的性質。 主屬性與非主屬性 包含在任何一個候選碼中的屬性 &#xff0c;稱為主屬性&#xff08;Prime attribute&#xff09;。 不包含在任何…

關于C編程的一點感受

剛畢業的時候用了兩個多月的C語言編程&#xff0c;總的來說對它還是很有感受的&#xff0c;C是一個過程式語言&#xff0c;沒有像C,Java等OOP語言這樣那樣的一系列的規則和限制&#xff1b;它比較靈活&#xff0c;簡潔&#xff0c;高效&#xff1b;這些是給我的印象最深的。這是…

如何打造高效的多任務、高并發的網絡服務器系統?

同一個功能的軟件&#xff0c;不同的團隊&#xff0c;不同工程師去實現&#xff0c;肯定是千差萬別&#xff0c;甚至從根本上完全不同。所以軟件開發在未來很長時間內仍然是一項工匠的手工勞動&#xff0c;尤其像多任務&#xff0c;高并發&#xff0c;偏底層這種對實現技巧比較…

BZOJ.2780.[SPOJ8093]Sevenk Love Oimaster(廣義后綴自動機)

題目鏈接 \(Description\) 給定n個模式串&#xff0c;多次詢問一個串在多少個模式串中出現過。(字符集為26個小寫字母) \(Solution\) 對每個詢問串進行匹配最終會達到一個節點&#xff0c;我們需要得到這個節點所代表的子串出現在多少個模式串中。 建立廣義后綴自動機。每次插入…

BigDecimal 加減乘除運算

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 java.math.BigDecimal。BigDecimal一共有4個夠造方法&#xff0c;讓我先來看看其中的兩種用法&#xff1a; 第一種&#xff1a;BigDeci…

主碼 超碼 候選碼

碼是數據系統中的基本概念。所謂碼就是能唯一標識實體的屬性&#xff0c;他是整個實體集的性質&#xff0c;而不是單個實體的性質。它包括超碼&#xff0c;候選碼&#xff0c;主碼。   超碼是一個或多個屬性的集合&#xff0c;這些屬性可以讓我們在一個實體集中唯一地標識一…

學成在線--18.新增課程(課程分類查詢)

文章目錄一.需求分析二.課程分類查詢介紹三.數據結構四.數據格式五.數據模型六.Api接口七.服務器端1.Dao1&#xff09;定義mapper2&#xff09;定義mapper映射文件2.Service3.Controller八.接口測試一.需求分析 用戶操作流程如下&#xff1a; 1、用戶進入“我的課程”頁面&…

給程序員們的工資報價提醒

在薪水上討價還價的方式有很多種&#xff0c;我要說的這一點也許并不是最好的。然而&#xff0c;如果使用的得當&#xff0c;會收到很好的效果。如果你正在跟一家公司接觸(沒有經過職業中介)&#xff0c;而且事情看來很順利&#xff0c;進度很快&#xff0c;你要保持這種面試的…

POI 方式-excle 表格導出實現-java-poi

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 效果&#xff1a; jsp 頁面 用的Bootstrap &#xff1a; <li class"dropdown"> <a href"javascript:void(0)…

02-css的選擇器

css的選擇器&#xff1a;1.基本選擇器 2.高級選擇器 基本選擇器包含&#xff1a; 1.標簽選擇器標簽選擇器可以選中所有的標簽元素&#xff0c;比如div&#xff0c;ul&#xff0c;li &#xff0c;p等等&#xff0c;不管標簽藏的多深&#xff0c;都能選中&#xff0c;選中的是所有…

iphoneX樣式兼容

// 1.viewport meta 標簽增加屬性viewport-fitcover // 2.body元素增加樣式 body { padding-bottom: constant(safe-area-inset-bottom); padding-bottom: env(safe-area-inset-bottom); } // 3.如有fixed底部的元素&#xff0c;也增加上面樣式 xxx { padding-bottom: constant…