Maven 快速入門
- 2021 年 8 月 9 日
- 筆記
- maven, Maven/Gradle
官網://maven.apache.org/index.html
POM 參考文檔: //maven.apache.org/pom.html
Settings 參考文檔: //maven.apache.org/settings.html
一、簡介
Maven 是一個用於構建/管理任何基於Java項目的工具,其本身也是基於Java的 因此需要Java環境。其最初是為了簡化 Jakarta Turbine 項目的構建而生。
其主要處理以下關心的領域:
- 使構建過程更簡單:使用 Maven 並不能消除對底層機制的了解需要,但仍能使開發者規避很多細節。
- 提供統一的構建系統:Maven 使用 POM(project object model,項目對象模型)和插件集構建項目。一旦你熟悉一個 Maven 項目,則會知道所有 Maven 項目的構建。
- 提供高品質的項目資訊:Maven 提供了有用的項目資訊,一部分來自 POM,一部分生成自源碼。(註:這部分不會太常用到,屬於 reporting 模組,即通過調用 “mvn site”,運行一個 Server,在網頁上展示項目相關資訊報告,如圖所示。詳情可參考: Apache Maven Site Plugin, Configuring Reports)
- 提供最佳的項目開發指導:Maven 意在收集當前最佳實踐開發原則,並使其變得更簡單以指導項目方向。
例如:- 目前單元測試這一最佳實踐作為了指導,單元測試的規範、執行、報告在 Maven 中作為了通常構建聲明周期的一部分。
- Maven 還協助項目工作流(workflow),例如發布(release)和問題管理(issue management)。
- Maven 在項目目錄結構的布局上也給出了一些指導建議,一旦你熟悉了這布局,可以很容易遊覽其他Maven項目。
Maven 在項目布局上較為堅持,雖然 Maven 設計為了靈活適應不同項目的需要,但它不可能在不影響目標的情況下滿足每一種不尋常結構的項目。因此若不能被重新組織,可能不得不放棄一些特性或Maven使用。
二、安裝
- 系統要求:
- Maven 3.3+ 需要 JDK1.7
- JAVA_HOME 環境變數確保指向了JDK目錄
- 下載/安裝:
2.1 Maven 官方提供現成 binary 分發: //maven.apache.org/download.cgi
2.2 解壓後將 bin 目錄添加進 PATH 即可
三、簡單使用
- 利用原型(Archetype)生成簡易項目結構:
1.1 在 PowerShell中執行:mvn archetype:generate "-DgroupId=com.mycompany.app" "-DartifactId=my-app" "-DarchetypeArtifactId=maven-archetype-quickstart" "-DarchetypeVersion=1.4" "-DinteractiveMode=false"
1.2 修改”pom.xml”添加以下內容,聲明 Java源碼版本資訊<properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties>
- 進入目錄,並打包成 jar
cd maven-sample mvn package //mvn會自動下載打包所需組件
- 執行測試
java -cp .\target\maven-sample-1.0-SNAPSHOT.jar top.simpleito.demo.App
四、主要模組/知識
1. 標準目錄布局(Standard Directory Layout)
//maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html
註:
- 標準目錄布局同時也是用 Maven 構建的默認值,比如哪裡是java源碼,測試目錄在哪,輸出目錄是什麼等等。
- 以下有些描述暫時覺得模糊也沒關係,一些部分並不常見 筆者也沒用過,像 it / filters / site / assembly等,臨時有大致概念即可。
- 從官方示例看,java 源碼包結構只要求和 groupId 相同即可,而不要求加一層 artifectId 的父包。但實際項目各種都有
maven-project
├───pom.xml 項目描述文件,定義在生命周期中所需的依賴和所需模組等等
├───README.txt 項目說明
├───NOTICE.txt 項目中使用第三方庫的資料
├───LICENSE.txt 許可文件
└───src 包含構建項目所需所有資料,site等等
├───main 最重要的目錄,所有工件(artifect)都應出現在這裡
│ ├───java 工件Java源碼
│ ├───resources 配置及資源等文件
│ ├───filters 包含在構建階段將值注入到resources目錄下配置屬性的文件
│ └───webapp 對於web應用,包含諸如JS/CSS/HTML等資源文件
├───test 所有測試程式碼及資源
│ ├───java
│ ├───resources
│ └───filters
├───it 通常是用於 Maven Failsafe Plugin 的集成測試
├───site 使用 Maven Site Plugin(//maven.apache.org/plugins/maven-site-plugin/index.html) 創建的site文檔
└───assembly 二進位打包裝配配置,一般也不常用適用 Apache Maven Assembly Plugin
└───target 用於容納 build 的所有輸出
2. POM(Project Object Model,項目對象模型)
//maven.apache.org/guides/introduction/introduction-to-the-pom.html
POM 是 Maven 中的基本工作單元,它是一個 XML 文件,包含了”項目有關資訊”和”配置Maven構建項目的細節”。
當執行一個任務時,Maven 會在當前目錄尋找 POM 文件,從而讀取所需的配置資訊。
POM 中可以指定許多資訊,包括:
- 依賴(dependencies)、插件(plugins) 或 可被執行的目標(goal)、構建配置(profiles)等。
- 以及關於項目的本身的資訊,如 版本(version)、說明(description)、開發人員(developers)等
需注意的是:POM 中的<groupid>:<artifactId>:<version>
構成了該工件的完全限定名
關於 POM、Super POM、最小POM等更多資訊參考:Maven POM 詳解
3. Settings(Maven本身設置)
//maven.apache.org/settings.html
settings.xml 包含對 Maven 自身的配置,不應綁定到任何特定項目分發給用戶。主要包含:本地儲存庫,代理,身份驗證資訊等等。
該配置文件可能存在兩個位置:
- 全局的設置:${maven.home}/conf/settings.xml
- 用戶級設置:${user.home}/.m2/settings.xml 【默認情況下可能不存在,可copy全局過來修改】
若都存在,則內容將被合併作用。優先順序:用戶級 > 全局
配置詳情參考:Maven Settings
4.Build Lifecycle(構建生命周期)
//maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
Maven 基於生命周期的概念,意味著構建(build)和分發(distributing)特定工件的過程得以清晰定義,意味著只需學習一小組命令,即可構建任何 Maven 項目。
有三種內置構建生命周期(build lifecycle):默認(default)、清理(clean)、site
需注意:
- 構建生命周期由構建階段(build phases)組成,每個階段都是生命周期中的一個步驟(stage),
- Maven 命令格式:mvn [options] [<goal(s)>] [<phase(s)>],可按需執行某個 phase
- build phase 將按順序執行,例如若執行 mvn install,將會執行在此之前的所有 phase
- build phase 又是由聲明插件所引入的插件目標(plugin goals)組成的。
一個 plugin goal 代表一個特定的任務(比phase更精細),它可能被綁定到零個或多各 build phase,不綁定的 plugin goal 可在 build lifecycle 之外直接自行執行
以 default 聲明周期為例,主要包含以下 phase:完整的請參考 Lifecycle Reference
- validate:驗證項目是否正確,所有必要資訊是否提供
- compile:編譯項目源碼
- test:使用合適的單元測試框架測試編譯後的源碼。這些測試程式碼不要求被打包或部署
- package:將編譯後的程式碼打包為分發格式,例如 JAR
- verify:運行繼承測試的所有檢查,以確保符合標準
- install:將 package 安裝到 Locale Repository(本地倉儲),用作其他項目依賴
- deploy:將最終 package 複製到 Remote Repository(遠程倉儲)
附/參考:
- 常見問題/需求QA: //maven.apache.org/guides/getting-started/index.html#sections
- Maven 官方入門指南: //maven.apache.org/guides/getting-started/maven-in-five-minutes.html
- Baeldung 關於 Standard Directory Layout 介紹文章(Maven官方介紹不好看): //www.baeldung.com/maven-directory-structure
關於Archetype更多可參考文檔,但不太常用: //maven.apache.org/archetype/maven-archetype-plugin/index.html