maven(一) 基础知识
文章目錄
- 1. maven介紹
- 2. maven生命周期
- 3. snapshot版本和release版本的區別
- 4. maven倉庫
- 5. plugin插件
- 6.maven命令
- 7. 繼承和聚合
1. maven介紹
Maven 翻譯為"專家"、“內行”,是 Apache 下的一個純 Java 開發的開源項目。基于項目對象模型(縮寫:POM)概念,
Maven 是一個項目管理工具,可以對 Java 項目進行構建、依賴管理。
Maven 下載地址:http://maven.apache.org/download.cgi
maven的安裝依賴于java環境,需要先安裝java環境。
2. maven生命周期
maven有三個標準的生命周期:
- clean:項目清理的處理
- default(或 build):項目部署的處理
- site:項目站點文檔創建的處理
每一個生命周期由許多階段(phase)組成,如build生命周期主要有validate compile test package install deploy。
注意:
- 當一個階段通過 Maven 命令調用時,例如 mvn package ,只有該階段之前以及包括該階段在內的所有階段會被執行。
- 生命周期是相互獨立的。如package是不包含clean的。
3. snapshot版本和release版本的區別
? ? ? ?snapshot快照是一種特殊的版本,指定了某個當前的開發進度的副本。不同于常規的版本,Maven 每次構建都會在遠程倉庫中檢查新的快照,Snapshot 版本代表不穩定、尚處于開發中的版本,Release 版本則代表穩定的版本。
什么情況下該用 SNAPSHOT?
? ? ? ?協同開發時,如果 A 依賴構件 B,由于 B 會更新,B 應該使用 SNAPSHOT 來標識自己。這種做法的必要性可以反證如下:
a. 如果 B 不用 SNAPSHOT,而是每次更新后都使用一個穩定的版本,那版本號就會升得太快,每天一升甚至每個小時一升,這就是對版本號的濫用。
b.如果 B 不用 SNAPSHOT, 但一直使用一個單一的 Release 版本號,那當 B 更新后,A 可能并不會接收到更新。因為 A 所使用的 repository 一般不會頻繁更新 release 版本的緩存(即本地 repository),所以B以不換版本號的方式更新后,A在拿B時發現本地已有這個版本,就不會去遠程Repository下載最新的 B
不用 Release 版本,在所有地方都用 SNAPSHOT 版本行不行?
? ? ? ?不行。正式環境中不得使用 snapshot 版本的庫。 比如說,今天你依賴某個 snapshot 版本的第三方庫成功構建了自己的應用,明天再構建時可能就會失敗,因為今晚第三方可能已經更新了它的 snapshot 庫。你再次構建時,Maven 會去遠程 repository 下載 snapshot 的最新版本,你構建時用的庫就是新的 jar 文件了,這時正確性就很難保證了。
4. maven倉庫
Maven 倉庫有三種類型:
- 本地(local)
- 中央(central)
- 遠程(remote)
本地倉庫
? ? ? ?Maven 的本地倉庫,在安裝 Maven 后并不會創建,它是在第一次執行 maven 命令的時候才被創建。運行 Maven 的時候,Maven 所需要的任何構件都是直接從本地倉庫獲取的。如果本地倉庫沒有,它會首先嘗試從遠程倉庫下載構件至本地倉庫,然后再使用本地倉庫的構件。
? ? ? ?默認情況下,不管Linux還是 Windows,每個用戶在自己的用戶目錄下都有一個路徑名為 .m2/respository/ 的倉庫目錄。Maven 本地倉庫默認被創建在 %USER_HOME% 目錄下。要修改默認位置,在 %M2_HOME%\conf 目錄中的 Maven 的 settings.xml 文件中定義另一個路徑。
中央倉庫鏡像
Maven 倉庫默認在國外, 國內使用難免很慢,我們可以更換為阿里云的倉庫。
方法很簡單,修改 maven 根目錄下的 conf 文件夾中的 setting.xml 文件,在 mirrors 節點上,添加內容如下:
<mirrors><mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf> </mirror> </mirrors>5. plugin插件
? ? ? ?插件是maven的核心,所有的功能都有插件來提供。每個插件都有多個目標goal,每個goal是對插件功能的細分。
注意,插件的運行是需要綁定到生命周期的某一個階段的。
6.maven命令
? ? ? ?maven的命令有兩種,一種是插件命令;一種是生命周期命令,他是maven為我們集成好的,多個插件命令的有序集合(也照應maven的功能都是由插件提供的),如mvn test , mvn package等等,方便很常用。
7. 繼承和聚合
- 依賴的范圍
| 編譯 | √ | 不可以 | √ |
| 測試 | √ | √ | √ |
| 運行 | √ | 不可以 | 不可以 |
| 舉例 | 依賴默認范圍 | junit | servlet-api |
依賴原則:
1.路徑最短優先原則。如果本工程就有,肯定用本工程的。
2.路徑相同時:
如果在同一個pom文件中有兩個相同的依賴(版本不同),后聲明的會覆蓋先聲明的。但這種用法肯定是錯誤的。
如果在不同的pom文件,則依賴先聲明的。即A依賴于B和C,B和C中分別有d1和d2依賴,則因為A中先聲明依賴的B,所以A依賴的為d1.
- 聚合
利用maven開發時工程一般是多模塊,利用聚合我們可以將多個模塊聚合在一起:
<!--包含的子模塊--><modules><module>cloud-api</module><module>cloud-common</module><module>cloud-web</module><module>cloud-view</module></modules>這樣我們只需要對父工程進行打包,子模塊也跟著被打包。maven在打包子模塊時會自動安排順序,即會先打包其他再打包實際的web工程。
注意聚合工程的<packaging>pom</packaging>”,即必須為pom!
- 繼承
繼承主要是為了消除重復。父工程中除了artifactId和name,基本上所有的元素都可以被繼承。父工程可以利用dependencyManagement來管理依賴版本。
聚合和繼承在開發中經常作為同一個同時使用,但兩者并無關系。聚合是為了方便同時打多個包,繼承是為了消除重復。
總結
以上是生活随笔為你收集整理的maven(一) 基础知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: maven(二)pom文件详解
- 下一篇: swagger2的使用和swagger2