Maven 快速入門

官網://maven.apache.org/index.html
POM 參考文檔: //maven.apache.org/pom.html
Settings 參考文檔: //maven.apache.org/settings.html

一、簡介

Maven 是一個用於構建/管理任何基於Java項目的工具,其本身也是基於Java的 因此需要Java環境。其最初是為了簡化 Jakarta Turbine 項目的構建而生。

其主要處理以下關心的領域:

  1. 使構建過程更簡單:使用 Maven 並不能消除對底層機制的了解需要,但仍能使開發者規避很多細節。
  2. 提供統一的構建系統:Maven 使用 POM(project object model,項目對象模型)和插件集構建項目。一旦你熟悉一個 Maven 項目,則會知道所有 Maven 項目的構建。
  3. 提供高品質的項目資訊:Maven 提供了有用的項目資訊,一部分來自 POM,一部分生成自源碼。(註:這部分不會太常用到,屬於 reporting 模組,即通過調用 “mvn site”,運行一個 Server,在網頁上展示項目相關資訊報告,如圖所示。詳情可參考: Apache Maven Site Plugin, Configuring Reports
  4. 提供最佳的項目開發指導:Maven 意在收集當前最佳實踐開發原則,並使其變得更簡單以指導項目方向。
    例如:

    • 目前單元測試這一最佳實踐作為了指導,單元測試的規範、執行、報告在 Maven 中作為了通常構建聲明周期的一部分。
    • Maven 還協助項目工作流(workflow),例如發布(release)和問題管理(issue management)。
    • Maven 在項目目錄結構的布局上也給出了一些指導建議,一旦你熟悉了這布局,可以很容易遊覽其他Maven項目。
      Maven 在項目布局上較為堅持,雖然 Maven 設計為了靈活適應不同項目的需要,但它不可能在不影響目標的情況下滿足每一種不尋常結構的項目。因此若不能被重新組織,可能不得不放棄一些特性或Maven使用。

二、安裝

  1. 系統要求:
    • Maven 3.3+ 需要 JDK1.7
    • JAVA_HOME 環境變數確保指向了JDK目錄
  2. 下載/安裝:
    2.1 Maven 官方提供現成 binary 分發: //maven.apache.org/download.cgi
    2.2 解壓後將 bin 目錄添加進 PATH 即可
    image

三、簡單使用

  1. 利用原型(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>
    
  2. 進入目錄,並打包成 jar
    cd maven-sample
    mvn package  //mvn會自動下載打包所需組件
    
  3. 執行測試
    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
需注意:

  1. 構建生命周期由構建階段(build phases)組成,每個階段都是生命周期中的一個步驟(stage),
  2. Maven 命令格式:mvn [options] [<goal(s)>] [<phase(s)>],可按需執行某個 phase
  3. build phase 將按順序執行,例如若執行 mvn install,將會執行在此之前的所有 phase
  4. 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(遠程倉儲)

附/參考: