Maven 是一個專案管理與自動化建構工具,主要用於 Java 專案,但也支援 C#、Ruby、Scala 等其它語言。目前 Maven 由 Apache軟體基金會 管理,因此也稱作 Apache Maven。
它解決了軟體開發的兩大難題:
通過在 XML 檔案中描述專案的基本資訊、與外部模組的依賴關係、建構順序、目錄與外掛程式,並執行 Maven 預設的建構流程就可快速完成編譯、打包等任務。Maven 會自動從遠端的程式庫下載依賴的函式庫與外掛程式,簡化手動下載的工作。
兩種安裝 Maven 的方式:
Eclipse 插件 — m2e
如果你使用的 IDE 是 Eclipse 可以直接使用 m2e 插件,能省略一些設定步驟。
Eclipse 預設內建 m2e
,可以打開 Eclipse 到 Help > About Eclipse IDE
確認是否已安裝。
如果沒有,請參考安裝說明: https://github.com/eclipse-m2e/m2e-core/blob/master/README.md#-installation
單獨安裝 Maven
安裝好 Maven 後到 IDE 設定 Maven。
Eclipse 設定方式:
window > Preferences > Maven > Installations
點 Add...
新增你的 Maven 根目錄,並勾選該項目表示使用這個目錄下的 Maven。window > Preferences > Maven > User Settings
把 User Settings
欄位設定成 Maven 目錄下的 settings.xml
路徑,然後點 Update Settings
。要使用 Maven 管理專案,可選擇建立純 Maven 專案或在其它類型專案中選擇用 Maven 管理,例如使用 Eclipse 的 Project Wizard 建立 Spring Boot 專案時會有選項讓你選擇要用 Maven 還是其它工具管理專案。
建立步驟根據你用的 IDE 與版本會有差異,這邊就不詳細贅述。後面的 IDE 操作都是以 Eclipse 為例。
my-app
|-- pom.xml (專案的 Maven 設定檔)
`-- src
| |-- main (開發主目錄)
| | |-- java (原始碼)
| | | `-- com
| | | `-- mycompany
| | | `-- app
| | | `-- App.java
| | `-- resources (各種靜態資源/設定檔)
| `-- test (測試主目錄)
| `-- java
| `-- com
| `-- mycompany
| `-- app
| `-- AppTest.java
`-- target (打包主目錄)
`-- my-app.jar/war
pom.xml
是 Maven 專案的核心設定檔。
以一個 Spring Boot 專案的 pom.xml
當範例:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.9</version>
<relativePath />
</parent>
<!-- 專案基本資訊 -->
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>My App</name>
<description>This is my app project</description>
<!-- 可在 properties 中自訂屬性,並在 POM 的其它地方用 ${屬性名} 引用 -->
<properties>
<lombok.version>1.18.22</lombok.version>
</properties>
<!-- 依賴的函式庫 -->
<dependencies>
<!-- 引用函式庫的設定 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<!-- 可把版本寫在此處,也可以設定在 <properties> 裡引用,方便管理 -->
<version>${lombok.version}</version>
<!-- 表示程式執行時,函式庫由 JDK 或容器提供,打包時不需包含進去 -->
<scope>provided</scope>
</dependency>
</dependencies>
</project>
<dependencies>
內可以設定多個 <dependency>
,不需要把函式庫依賴的其它項目也加進來,Maven 會自動導入所有需要的依賴項。
看起來很複雜對吧?別害怕,Eclipse 也有提供圖形化介面讓你不用接觸 POM 的語法也能進行設定。而且 Maven 已經是很成熟的工具,網路上資源相當豐富,很多時候就只是複製貼上而已。
在動手建構專案前先讓我們了解一些 Maven 的基本概念。
Build Lifecycle (建構生命週期) 是 Maven 建構專案的核心概念。Maven 有三個 lifecycle,分別是:
default
- 部屬專案clean
- 清理專案site
- 建立文件網站Lifecycle 由一連串有序的 Phase (階段) 組成,例如生命週期 default
包含以下 Phase:
以下 phase 已簡化,非完整的
default
生命週期。
validate
- 驗證專案是否正確compile
- 編譯程式碼test
- 單元測試package
- 打包verify
- 整合測試install
- 打包好的結果放到本地 repository,作為一個依賴項給其它專案使用deploy
- 打包好的結果放到遠端 repository,供其他人使用如果想把專案打包成 JAR,只要在 CLI 執行指令:
mvn package
Maven 會從 validate
開始照順序執行到 package
,並把打包好的檔案放在 target
目錄下。
Phase 代表 lifecycle 的某個階段,而完成階段的方式可能不止一種。Goal 代表某種特定的任務,它由 Plugin 提供並綁定到某些 phase。沒有綁定到 phase 的 goal 可以單獨執行,例如:
mvn clean dependency:copy-dependencies package
指令使 Maven 按照順序執行:
clean
- Lifecycle clean
中唯一的一個 phase — clean
。dependency:copy-dependencies
- Plugin dependency
的 goal — copy-dependencies
。package
- Lifecycle default
執行到 phase package
為止。想詳細了解有那些 phase/goal 可參考以下連結:
在你的專案名稱上點右鍵 Run As > Maven Build...
打開以下視窗:
在 Goals
欄位填入 clean package
(這邊不用像 CLI 以 mvn 開頭),點 Apply > Run
。
Maven 會先執行 clean
刪除 target
目錄,再執行 package
打包專案,當你看到...
[INFO] BUILD SUCCESS
恭喜,你成功啦!
打包好的檔案就在 target
目錄下,以後要執行一樣的指令時,在專案名稱上點右鍵 Run As > Run Configurations...
能找到以前配置過的設定。