Apache Maven

Apache Maven是一套軟體專案管理及自動構建工具,由Apache軟體基金會所提供,解決了軟體構建的兩方面的問題:一是軟體是如何構建的,二是軟體的依賴關係,基於專案模型(Project Object Model, POM)的抽象概念管理專案的構建、報告和文件。官方網站: https://maven.apache.org/

Maven Project下會存有pom.xml這個檔案,由XML格式撰寫,pom為Project Object Model的縮寫,其內容包含專案的描述、依賴、使用的plugin及Maven該如何建置專案的等配置說明,以便開發人員可以更好「理解」專案。
物件指的是軟體運行時,真正在運作的"東西",它是"活的"、會"和其他物件交互"的、依"某個目的進行運作的"。所以 pom.xml 基本上可以看成是一個「劇本」,它描述了 Maven project 這齣劇的演員有哪些?出場順序是什麼?

  • 構建:
  • 依賴: 從Repository取得依賴的檔案

Maven Repository

存放Artifact(構建)的地方,以Java軟體來說,就是存放jar檔的地方。

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

Remote Repository遠端倉庫

Maven Central Repository: https://mvnrepository.com/

Internal Repository

也是Remote Repostory,但為組織自行建立的私有倉庫。

Local Repository本地倉庫

本機存放構建的資料夾

預設位置: 在Windows使用者資料夾底下,且為隱藏的資料夾,資料夾名稱為.m2/repository`

專案結構

- sample-project
  |-- pom.xml
  |-- src
  |   |-- main
  |   |   |-- java       : 存放產品或專案程式
  |   |   `-- resources
  |   `-- test
  |       |-- java       : 存放測試程式
  |       `-- resources
  `-- target
      `-- sample-app.jar

POM說明


archetype (原型):用以說明目前的 project ,其初始目的及具備的元素。
groupId:用以表示 project 被什麼組織所建立、擁有。
archetypeId:用以表示 project 的名稱。
artifact:用以表示這個 project 的 archetype 是某個他人所預先建構好的。
archetypeArtifaceId:用以表示目前的 project 是參考某個他人預先建構好的 archetype 以重製建構出來的。
dependencies:聲明專案所需依賴,建置時自動下載相應的jar檔
Plugins:TODO

版本定義

<主版本>.<次版本>.<增量版本>-<里程碑版本>

  • 主版本: 表示有重大的架構改變
  • 次版本: 表示較大範圍的功能新增或修改,但架構並未調整
  • 增量版本: 表示重大Bug修復
  • 里程碑(常用如下所示)
    • SNAPSHOT(快照版本)
    • alpha: 內測版
    • beta版: 公測版
    • RELEASE(釋出版本)

Life Cycle生命週期

當Maven開始建立一個項目,它通過定義序列的階段步驟和執行注冊的每個階段的目標。 Maven的有以下三種標準的生命周期:

路線(一)
Clean Lifecycle(清理生命週期)
只有 clean 指令將上一次建構好的文件與資料夾移除,確保後續動作完全從零執行

mvn clean  # 刪除 src 底下的 target 資料夾
  • target 資料夾中放的是 編譯後的 Spring Boot 程式

路線(二): 一定會先執行前面才會執行後面

mvn validate: # 驗證專案是否正確,所有必要的資訊是否可用。
      ⬇
mvn compile   # 編譯 Spring Boot 程式
      ⬇
mvn test      # 運行單元測試
      ⬇
mvn package   # 指令會在專案根目錄下生成一個 target 目錄,並將打包後的 JAR 檔放在這個目錄中。
      ⬇
mvn verify: # 執行整合測試,驗證打包的正確性和品質。 
      ⬇
mvn install   # 將 .jar 檔存放到 Local 倉庫 (~/.m2/repository)
      ⬇
mvn deploy    # 將 .jar 檔上傳到 Remote 倉庫

validate:這是生命週期的第一個階段。在這個階段,Maven將驗證項目的結構是否正確,以及所有必需的信息是否可用。如果項目的POM文件或配置有誤,Maven會在這個階段報錯並中止構建。

initialize:這是生命週期的一個空階段,通常不會做任何實際的操作。它存在只是為了保持向後兼容性。

generate-sources:在這個階段,Maven會生成任何需要的源代碼,通常是根據特定的插件配置生成。

process-sources:這個階段用於處理和修改源代碼,通常由一些特定的插件執行額外的操作。

generate-resources:在這個階段,Maven會生成任何需要的資源文件,例如配置文件或屬性文件。

process-resources:這個階段用於處理和修改資源文件,通常也是由一些特定的插件執行額外的操作。

compile:在這個階段,Maven會將項目的Java源代碼編譯成字節碼文件(.class文件)。

process-classes:在這個階段,Maven可以再次處理編譯後的類文件,通常由一些特定的插件執行額外的操作。

generate-test-sources:在這個階段,Maven會生成測試時所需要的源代碼,通常是根據特定的插件配置生成。

process-test-sources:這個階段用於處理和修改測試時所需的源代碼,通常由一些特定的插件執行額外的操作。

generate-test-resources:在這個階段,Maven會生成測試時所需要的資源文件,例如測試配置文件或屬性文件。

process-test-resources:這個階段用於處理和修改測試時所需的資源文件,通常由一些特定的插件執行額外的操作。

test-compile:在這個階段,Maven會將測試時的Java源代碼編譯成字節碼文件。

process-test-classes:在這個階段,Maven可以再次處理編譯後的測試類文件,通常由一些特定的插件執行額外的操作。

test:這是生命週期中的一個重要階段,用於運行單元測試。Maven會執行測試,並且如果測試失敗,Maven會在這個階段報錯並中止構建。

prepare-package:這個階段用於準備項目的打包,通常由一些特定的插件執行額外的操作。

package:在這個階段,Maven會將編譯後的代碼打包成特定的可執行文件,如JAR、WAR等。

pre-integration-test:這個階段用於在集成測試之前執行必要的準備工作,通常由一些特定的插件執行額外的操作。

integration-test:這個階段用於運行集成測試。Maven會將應用程序部署到測試環境並運行測試。

post-integration-test:這個階段用於在集成測試之後執行清理和其他必要的工作,通常由一些特定的插件執行額外的操作。

verify:這個階段用於驗證構建的結果。Maven會檢查項目是否通過所有測試,並且是否符合構建要求。

install:在這個階段,Maven會將打包的項目安裝到本地的Maven存儲庫,以供其他項目引用。

deploy:這是生命週期的最後一個階段。在這個階段,Maven會將打包的項目安裝到遠程的Maven存儲庫,以供其他團隊成員或項目引用。

Site Lifecycle(站點生命週期)
這個階段主要是生成網站相關文件,並在生成文件前後運行相關任務

路線(三)
可以分為執行任務依序為這四個階段

pre-site
在執行產生文件前(mvn site)前執行的階段,可以用來產生其他文件或相關操作,配置方式可以參考 maven-antrun-plugin

site
可以生成網站相關說明文件如PDF、MarkDown及HTML等相關文件,

post-site
文件產生以後要執行的後處理任務

deploy-site
將生成結果上傳至指定位置

pom.xml配置
<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-site-plugin</artifactId>
   <version>3.9.1</version>
   <configuration>
     <!--實際生成內容可以參考相關文件教學-->
   </configuration>
</plugin>

除了這三個標準生命週期之外,Maven 還允許開發者自定義生命週期,以滿足特定專案的需求。自定義生命週期可以使用插件來定義新的階段和執行順序。

CLI

https://maven.apache.org/ref/3.6.3/maven-embedder/cli.html

$ mvn package 打包 $ mvn compile 編譯 $ mvn clean 清除 $ mvn install 安裝 $ mvn test 運行測試 $ mvn test-compile 編譯測試 $ mvn site 產生site $ mvn eclipse:eclipse 產生eclipse項目 $ mvn idea:idea 產生idea項目 $ mvn ... -Dmaven.test.skip 跳過測試,不產生檔案 $ mvn ... -DskipTests 跳過測試,產生檔案 $ mvn --version 顯示版本 $ mvn --help:system 顯示系統資訊

執行package、compile進行build,過程中會產生檔案輸出的預設資料夾(target),進去資料夾會看到打包出的jar

執行clean會移除target,在每次重新建置前要先執行此指令保證專案的乾淨,需注意的是該指令同時也會將編譯過的class及暫存資料清除,所以需要重新執行compile,否則執行時會出錯

執行install會根據pom安裝對應jar到local,在pom新增依賴時需要先執行install,否則compile會產生錯誤

執行site會生成相關報告,格式通常為HTML,可以在target/site資料夾找到

-Dmaven、-DskipTests同樣是跳過測試,不同地方是後者仍會根據test產生對應class檔案

help:system 顯示諸如環境變數等

Project 構建

  • 用途: 對 Spring Boot project 進行「編譯」、「測試」、「運行」、「清理」、「打包」
  • 用法: 透過 mvn 指令操作

Maven Repository

  • 用途: 儲存 Spring Boot project 依賴的 Library (.jar 檔)
  • 可以分為「Local Repository」和「Remote Repository」
    • Local Repository 存放位置: ~/.m2/repository
  • 只有當 Local 找不到時,才會去 Remote 找

Maven 下載安裝

下載連結

安裝說明

下載後需要設定path的環境變數

設定成功後應可查到版本

問題

  1. pom.xml裡面<dependencies>可以設定在外層,也可以在<dependencyManagement>
    (https://www.cnblogs.com/EasonJim/p/6845012.html)
  2. pom.xml裡面<plugin>
  3. 如何將resources設定不同的環境