Maven 的一些概念和參考
Maven 翻譯為"專家"、“內行”,是 Apache 下的一個純 Java 開發的開源專案。基於專案物件模型(縮寫:POM)概念,Maven利用一箇中央資訊片斷能管理一個專案的構建、報告和文件等步驟。
Maven 是一個專案管理工具,可以對 Java 專案進行構建、依賴管理。
Maven 也可被用於構建和管理各種專案,例如 C#,Ruby,Scala 和其他語言編寫的專案。Maven 曾是 Jakarta 專案的子專案,現為由 Apache 軟體基金會主持的獨立 Apache 專案。
Maven 功能
Maven 能夠幫助開發者完成以下工作:
- 構建
- 文件生成
- 報告
- 依賴
- SCMs
- 釋出
- 分發
- 郵件列表
POM
POM( Project Object Model,專案物件模型 ) 是 Maven 工程的基本工作單元,是一個XML檔案,包含了專案的基本資訊,用於描述專案如何構建,宣告專案依賴,等等。
執行任務或目標時,Maven 會在當前目錄中查詢 POM。它讀取 POM,獲取所需的配置資訊,然後執行目標。
POM 中可以指定以下配置:
- 專案依賴
- 外掛
- 執行目標
- 專案構建 profile
- 專案版本
- 專案開發者列表
- 相關郵件列表資訊
Maven 依賴搜尋順序
當我們執行 Maven 構建命令時,Maven 開始按照以下順序查詢依賴的庫:
- 步驟 1 - 在本地倉庫中搜索,如果找不到,執行步驟 2,如果找到了則執行其他操作。
- 步驟 2 - 在中央倉庫中搜索,如果找不到,並且有一個或多個遠端倉庫已經設定,則執行步驟 4,如果找到了則下載到本地倉庫中已被將來引用。
- 步驟 3 - 如果遠端倉庫沒有被設定,Maven 將簡單的停滯處理並丟擲錯誤(無法找到依賴的檔案)。
- 步驟 4 - 在一個或多個遠端倉庫中搜索依賴的檔案,如果找到則下載到本地倉庫已被將來引用,否則 Maven 將停止處理並丟擲錯誤(無法找到依賴的檔案)。
Maven 阿里雲(Aliyun)倉庫
Maven 倉庫預設在國外, 國內使用難免很慢,我們可以更換為阿里雲的倉庫。
修改 maven 根目錄下的 conf 資料夾中的 setting.xml 檔案,在 mirrors 節點上,新增內容如下:
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
為什麼我看到有些專案的 Maven 地址是 http://maven.aliyun.com/nexus/content/groups/public/ ?
http://maven.aliyun.com/ 首頁上顯示的倉庫地址為推薦使用的倉庫地址。為了保證相容性也也支援以前的倉庫地址,使用者仍然可以通過 http://maven.aliyun.com/nexus/content/groups/public 來使用服務。
注:Nexus 是Maven倉庫管理器,如果你使用Maven,你可以從Maven中央倉庫 下載所需要的構件(artifact),但這通常不是一個好的做法,你應該在本地架設一個Maven倉庫伺服器,在代理遠端倉庫的同時維護本地倉庫,以節省頻寬和時間,Nexus就可以滿足這樣的需要。
Maven 的 Snapshot 版本與 Release 版本
1、Snapshot 版本代表不穩定、尚處於開發中的版本。
2、Release 版本則代表穩定的版本。
3、什麼情況下該用 SNAPSHOT?
協同開發時,如果 A 依賴構件 B,由於 B 會更新,B 應該使用 SNAPSHOT 來標識自己。這種做法的必要性可以反證如下:
- a. 如果 B 不用 SNAPSHOT,而是每次更新後都使用一個穩定的版本,那版本號就會升得太快,每天一升甚至每個小時一升,這就是對版本號的濫用。
- b.如果 B 不用 SNAPSHOT, 但一直使用一個單一的 Release 版本號,那當 B 更新後,A 可能並不會接受到更新。因為 A 所使用的 repository 一般不會頻繁更新 release 版本的快取(即本地 repository),所以B以不換版本號的方式更新後,A在拿B時發現本地已有這個版本,就不會去遠端Repository下載最新的 B
4、 不用 Release 版本,在所有地方都用 SNAPSHOT 版本行不行?
不行。正式環境中不得使用 snapshot 版本的庫。 比如說,今天你依賴某個 snapshot 版本的第三方庫成功構建了自己的應用,明天再構建時可能就會失敗,因為今晚第三方可能已經更新了它的 snapshot 庫。你再次構建時,Maven 會去遠端 repository 下載 snapshot 的最新版本,你構建時用的庫就是新的 jar 檔案了,這時正確性就很難保證了。
參考文章
- Runoob – Maven 教程
- Java構建工具:Ant vs Maven vs Gradle
- 構建工具的進化:ant, maven, gradle
- Maven、gradle、Ant、Eclipse IDE 之間的關係
- 雲棲社群 – 最快的 maven repository–阿里映象倉庫
- 雲棲社群 – 【FAQ】新版maven.aliyun.com答疑
- Nexus入門指南(圖文)