# 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取得依賴的檔案 [TOC] ## Maven Repository 存放Artifact(構建)的地方,以Java軟體來說,就是存放jar檔的地方。  ### Remote Repository遠端倉庫 Maven Central Repository: https://mvnrepository.com/ ### Internal Repository 也是Remote Repostory,但為組織自行建立的私有倉庫。 ### Local Repository本地倉庫 本機存放構建的資料夾 > 預設位置: 在Windows使用者資料夾底下,且為隱藏的資料夾,資料夾名稱為.m2/repository` ## 專案結構 ```text - sample-project |-- pom.xml |-- src | |-- main | | |-- java : 存放產品或專案程式 | | `-- resources | `-- test | |-- java : 存放測試程式 | `-- resources `-- target `-- sample-app.jar ``` ## POM說明 ```xml ``` 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 指令將上一次建構好的文件與資料夾移除,確保後續動作完全從零執行 ```yaml mvn clean # 刪除 src 底下的 target 資料夾 ``` - target 資料夾中放的是 編譯後的 Spring Boot 程式 路線(二): 一定會先執行前面才會執行後面 ```yaml mvn validate: # 驗證專案是否正確,所有必要的資訊是否可用。 ⬇ mvn compile # 編譯 Spring Boot 程式 ⬇ mvn test # 運行單元測試 ⬇ mvn package # 指令會在專案根目錄下生成一個 target 目錄,並將打包後的 JAR 檔放在這個目錄中。 ⬇ mvn verify: # 執行整合測試,驗證打包的正確性和品質。 ⬇ mvn install # 將 .jar 檔存放到 Local 倉庫 (~/.m2/repository) ⬇ mvn deploy # 將 .jar 檔上傳到 Remote 倉庫 ``` :::spoiler **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(站點生命週期) 這個階段主要是生成網站相關文件,並在生成文件前後運行相關任務 路線(三) 可以分為執行任務依序為這四個階段 ```yaml 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 ```bash= $ 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 顯示諸如環境變數等 [參考文件]: https://medium.com/@wuufone/%E9%97%9C%E6%96%BC-maven-%E6%88%91%E6%83%B3%E8%AA%AA%E7%9A%84%E6%98%AF-2-b63f83153618 ### Project 構建 - 用途: 對 Spring Boot project 進行「編譯」、「測試」、「運行」、「清理」、「打包」 - 用法: 透過 `mvn` 指令操作 ### Maven Repository - 用途: 儲存 Spring Boot project 依賴的 Library (.jar 檔) - 可以分為「Local Repository」和「Remote Repository」 - Local Repository 存放位置: `~/.m2/repository` - 只有當 Local 找不到時,才會去 Remote 找 ### Maven 下載安裝 [下載連結](https://maven.apache.org/download.cgi) [安裝說明](https://maven.apache.org/install.html) 下載後需要設定path的環境變數  設定成功後應可查到版本  ## 問題 1. pom.xml裡面`<dependencies>`可以設定在外層,也可以在`<dependencyManagement>` (https://www.cnblogs.com/EasonJim/p/6845012.html) 2. pom.xml裡面`<plugin>` 3. 如何將resources設定不同的環境
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up