Maven

Maven 是一個專案管理與自動化構建的工具,主要用於 Java 的專案。 目前由  Apache 軟體基金會管理。另外一個常見的工具 Gradle,這邊就不多介紹,主要的用途都類似。

是根據專案物件模型(Project Object Model, POM)概念設計,在 pom.xml 檔案中描述專案的基本資訊、與外部模組的依賴關係、建構順序、目錄與外掛程式,並執行 Maven 提供的構建方法就可快速完成編譯、打包等等。剛進入透過 Maven 管理的專案會自動從遠端的程式庫 (mvn repository)下載依賴

專案結構

當我們剛創建好一個由 Maven 構建的 Spring Boot 專案,他的結構會像是下面這樣

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
my-spring-boot-app
│ pom.xml
└───src
└───main
│ ├───java
│ │ └───com
│ │ └───example
│ │ └───demo
│ │ └───DemoApplication.java
│ └───resources
│ ├───application.properties
│ └───static
│ └───templates
└───test
└───java
└───com
└───example
└───demo
└───DemoApplicationTests.java

![https://ithelp.ithome.com.tw/upload/images/20240821/201509775QKIvymNt5.png](https://ithelp.ithome.com.tw/upload/images/20240821/201509775QKIvymNt5.png)

## pom.xml

可以點開 pom.xml

```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>3.3.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.oseanchen</groupId>
<artifactId>demoproj</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demoproj</name>
<description>demoproj</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

這個檔案紀錄目前該專案所有重要構建資訊,

只要你對這份文件上面有進行任何修改 Maven 都會自動根據你的需求重新構建

一些重要資訊說明

SpringBoot 相關資訊

可以知道目前運行版本,如果直接改動 reload 後會自動轉換成不同版

1
2
3
4
5
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.2</version>
</parent>

專案資訊

1
2
3
4
5
<groupId>com.oseanchen</groupId>
<artifactId>demoproj</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demoproj</name>
<description>demoproj</description>

groupId : 通常預設建議是公司或個人名稱及網域

artifactId: groupid 下一層 package,通常也是專案名稱

仔細看一下專案結構會發現啟動類就放在 com.oseanchen.demoproj 下面,這也是根據當初建立專案時設定這些內容所產生

version: 專案版本

name: 專案名稱

decription: 專案描述

Java 版本

1
2
3
<properties>
<java.version>17</java.version>
</properties>

依賴(dependencies)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<dependencies>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

</dependencies>

這邊可以根據我們需要加入,如果你不確定對應的 gorupId, artifacId 可到 mvn repository 上面搜尋對應的套件名稱及版本(下圖紅框) 就可以根據同樣的格式引入,下面是只有引入 mysql,你可以選擇你要的版本進到最後資訊頁下面有引入的 xml (下圖綠框) 可以直接複製貼到 pom.xml 裡面

https://ithelp.ithome.com.tw/upload/images/20240822/20150977E1uQPtwuBw.png

Maven Lifecycle

再來通常 IDE 都會整合 maven 的構建功能直接讓我們可以使用,也可以透過指令,但要另外安裝 maven 至本機,我這邊以 Intellij 提供 maven 整合的插件做說明,可以直接點選右邊 maven 圖示(我有改過 icon,所以原本應該是個 m 的圖示),點開後選擇專案的 package 下面會有一個 life cycle,就可以看到整個專案構件的生命週期分成哪些步驟。

https://ithelp.ithome.com.tw/upload/images/20240822/201509771qUmVDYZa0.png

三種基本的 build life cycle:

  • Clean Lifecycle — 清理專案的生命週期 (共 3 個 Phase) 用於清除先前建置或打包專案時所產生的檔案。通常在專案建置時,所產生的那些檔案都會被放置於 target 的資料夾底下,因此當你執行clean 的生命週期時,也就會把 target 資料夾給刪除。
  • Default Lifecycle — 建構專案的預設生命週期 (共 23 個 Phase) 流程中,包含幾個重要階段下面會依照順序執行,也是 Intellij maven pulgin 右側選單可以看到的。
    1. validate:檢查專案是否所有必需的資訊都有符合或都為正確資訊。
    2. compile:編譯專案的原始程式碼。
    3. test:透過一些單元測試的框架來執行測試。
    4. package:將編譯完成後的內容打包成被指定的格式,例如 .jar 或 .war,放入 target 資料夾內,顯示的名稱會是 pom.xml 專案資訊部分 artifactId + version。
    5. verify:檢查測試結果,以確保專案的品質
    6. install:將打包後的結果安裝在本地端的 maven repository,供其他本地端的專案導入使用。
    7. deploy:在本地端(建構環境)中完成建構確認沒有錯誤發生後,就會將打包後的結果上傳到遠端的 maven repository 供全世界的人使用。
  • Site Lifecycle — 建立專案站點的生命週期(共 4 個 Phase)用於產生一些專案說明文件的網站,會將生成 html 的頁面作為網站的說明文件。

當你執行了任何一個 Phase,則 maven 會從第一個 Phase 開始執行,直到你所指定的 Phase 執行完成後才會結束動作,除非中間有遇到問題,例如選擇 package 就會依序 validate → compile → test → package ,如果 test 有未通過就會中斷,測試部分是可以自己配置是否要略過。

實務上這些過程都會根據自身需求調整配置,像是多半現在許多專案都會配合 docker build , push 上雲等等,也可以加入 docker plugin 進行,不一定走完完整的 life cycle,這些就是基本 Maven 的構件 SpringBoot 專案的

Ref: