Maven 從 0 到 1:安裝、配置與依賴管理一站式指南
- Maven 從 0 到 1:安裝、配置與依賴管理一站式指南
- 一、Maven 是什么?
- 二、核心概念:POM
- 三、Maven 是如何工作的?—— 倉庫機制
- 四、安裝Maven
- 五、在 IntelliJ IDEA 里配置Maven
- 六、解析 Maven 坐標
- 6.1 Maven 坐標的核心組成部分
- 6.2 一個具體的例子
- 6.3其他重要概念
- 6.4總結
- 七、Maven 依賴配置超簡三步走
- 第 1 步:找到依賴項信息
- 第 2 步:將依賴項添加到 pom.xml
- 第 3 步:排除依賴
- 八、Maven 生命周期核心講解
- 1. 三大生命周期 (Lifecycle)
- 2. 生命周期階段 (Phase)
- 3. 在IDEA里面使用Maven命令
- 4. 在終端里使用Maven命令
Maven 從 0 到 1:安裝、配置與依賴管理一站式指南
你是否曾經在開始一個 Java 項目時,面對一堆需要下載的 .jar
包感到頭疼?是否因為項目結構混亂,導致團隊協作困難?別擔心,Maven 就是來解決這些問題的!
這篇文章將用最通俗易懂的方式,帶你從零開始認識 Maven。
一、Maven 是什么?
簡單來說,Maven 是一個項目管理和構建工具。
你可以把它想象成一個非常智能、全能的項目助理。你只需要告訴它你的項目需要什么(比如需要 Spring 框架版本 5.x,需要 JUnit 來測試),它就會自動幫你:
- 下載和管理這些依賴的庫(
.jar
包)。 - 編譯你的源代碼。
- 運行測試用例。
- 打包你的項目(打成
.jar
或.war
文件)。 - 部署你的項目。
它的核心思想是 “約定優于配置” 。這意味著 Maven 已經為你規定好了一個標準的項目目錄結構。只要你按照這個結構來放置文件,Maven 就知道該去哪里找源代碼、資源文件等,你就不需要再寫一大堆配置去告訴它了。
二、核心概念:POM
Maven 的所有行為都圍繞一個核心文件展開:pom.xml
。
POM 的全稱是 Project Object Model(項目對象模型)。它就像是你這個項目的“身份證”和“說明書”,存放在你項目的根目錄下。
在這個 pom.xml
文件里,你定義了關于你項目的所有重要信息,Maven 正是通過讀取這個文件才知道該如何工作的。
一個最基本的 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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!-- 項目坐標:這三個信息唯一標識了你的項目 --><groupId>com.mycompany</groupId> <!-- 公司或組織名,倒敘域名 --><artifactId>my-first-app</artifactId> <!-- 項目名 --><version>1.0.0-SNAPSHOT</version> <!-- 版本號 --><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><!-- 依賴列表 --><dependencies><!-- 一個具體的依賴 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope> <!-- 作用域:只在測試時使用 --></dependency></dependencies>
</project>
什么是“坐標”?
groupId
,artifactId
,version
這三個屬性組成了 Maven 世界的“坐標”,通過這個坐標,Maven 可以唯一地定位到任何一個第三方庫。這也是它能夠自動下載依賴的秘訣。
三、Maven 是如何工作的?—— 倉庫機制
Maven 通過倉庫來統一管理所有依賴。
- 本地倉庫:在你個人電腦上的一個文件夾。Maven 會先把所有下載好的 jar 包放在這里。默認路徑是
~/.m2/repository
。 - 中央倉庫:由 Maven 社區維護的全球唯一倉庫。當你聲明了一個依賴后,Maven 會首先在本地倉庫查找,如果找不到,就會自動去中央倉庫下載到你本地。
- 私服:一些大公司會在內部搭建的私有倉庫服務器,作為中央倉庫的鏡像,目的是節省帶寬和加速構建。
這個過程完全是自動的,你只需要在 pom.xml
中聲明 “我需要什么”
,而不需要手動搜索、下載、添加。這極大地解決了依賴管理帶來的混亂。
四、安裝Maven
Maven官網下載地址:https://maven.apache.org/download.cgi
下載好了之后將壓縮包解壓在沒有中文路徑的地方。
- 配置一個本地倉庫(新建一個名為mvn_repo的文件夾)
我此處的路徑為:D:\apache-maven-3.9.11\mvn_repo
- 修改配置文件,用記事本打開
"D:\apache-maven-3.9.11\conf\settings.xml"
添加這串代碼
<localRepository>D:\apache-maven-3.9.11\mvn_repo</localRepository>
- 將鏡像替換為阿里云鏡像
<mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf></mirror>
- 在系統變量里面添加
%MAVEN_HOME%
目錄選擇D:\apache-maven-3.9.11
- 在path里面新建一個
%MAVEN_HOME%\bin
- 在cmd里面輸入
mvn -v
若出現這個則說明安裝完成
五、在 IntelliJ IDEA 里配置Maven
首先打開 IntelliJ IDEA 的設置(記得先關閉當前項目,在全局設置里面調,不然調的是項目的設置)
-
在構建、執行、部署里找到構建工具——>Maven
更改主路徑和用戶設置文件
-
在 Maven的下面的【運行程序】里面添加當前你的JRE版本
-
檢查Java編譯器,項目字節碼版本應該與語言級別相同
-
創建一個新項目,在項目結構里面檢查一下
-
運行成功就說明配置好了
六、解析 Maven 坐標
Maven 坐標是 Maven 的核心概念,它就像是一個物件的唯一身份證,通過一組標識來精確定位和管理項目所依賴的任何一個構件(Jar 包、War 包等)。
6.1 Maven 坐標的核心組成部分
一個完整的 Maven 坐標主要由以下 5 個基本元素組成,其中前三個是必選的,后兩個是可選的。
元素 | 說明 | 是否必須 | 舉例 |
---|---|---|---|
groupId | 組織/公司標識。通常使用反向域名規則,如公司域名倒序。它定義了項目所屬的組織或集團,下轄多個 artifactId 。 | 必須 | org.springframework.boot , com.google.guava |
artifactId | 項目/模塊標識。代表該組織下的一個具體項目或模塊。生成的構件的名稱會基于這個 artifactId 。 | 必須 | spring-boot-starter-web , guava |
version | 版本號。指定項目的當前版本。 | 必須 | 2.7.3 , 31.1-jre |
packaging | 打包方式。指定項目構建后生成的構件類型。如果未指定,默認為 jar 。 | 可選 | jar , war , pom , maven-plugin , ear |
classifier | 分類器。用于區分從相同 POM 但內容不同的構件。例如,javadoc 和 sources 構件。 | 可選 | sources (源碼包), javadoc (文檔包), jdk8 (針對JDK 8的版本) |
6.2 一個具體的例子
我們來看一個非常常見的 Maven 依賴聲明,它來自 pom.xml
文件中<dependencies>
部分:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.7.3</version></dependency>
解析這個坐標:
-
groupId: org.springframework.boot
- 這告訴我們,這個依賴是由 Spring Boot 這個組織(項目)維護的。所有 Spring Boot 官方提供的構件都以這個開頭。
-
artifactId: spring-boot-starter-web
- 這是 Spring Boot 組織下的一個具體模塊,名為
spring-boot-starter-web
。從名字就能看出,它是用于支持 Web 應用開發的起步依賴。
- 這是 Spring Boot 組織下的一個具體模塊,名為
-
version: 2.7.3
- 這個 Web 起步依賴的具體版本是 2.7.3。Maven 會根據這個版本號去倉庫里尋找對應的
jar
文件。
- 這個 Web 起步依賴的具體版本是 2.7.3。Maven 會根據這個版本號去倉庫里尋找對應的
-
packaging: jar
(默認值,未顯式寫出)- 這個依賴最終被打包成一個 Jar 文件,例如
spring-boot-starter-web-2.7.3.jar
。
- 這個依賴最終被打包成一個 Jar 文件,例如
最終,Maven 會根據這個坐標,在本地倉庫或遠程中央倉庫中尋找名為:
org/springframework/boot/spring-boot-starter-web/2.7.3/spring-boot-starter-web-2.7.3.jar
的文件。
6.3其他重要概念
-
坐標的唯一性:
groupId
+artifactId
+version
+packaging
+classifier
這五個元素組合起來,構成了一個全球唯一的標識。世界上不會有兩個構件擁有完全相同的這組坐標。 -
SNAPSHOT
版本:版本號中如果帶有-SNAPSHOT
(例如1.0.0-SNAPSHOT
),表示這是一個快照版本,通常處于開發階段。Maven 會優先去遠程倉庫檢查是否有更新的快照版本,這對于團隊協作開發非常有用。 -
版本范圍:你可以指定一個版本范圍而不是固定版本(如
[1.2.0,)
),但不推薦使用,因為它會導致構建的不確定性。 -
<scope>
:雖然不屬于坐標本身,但常與坐標一同使用。它定義了依賴的作用范圍(如compile
,test
,provided
,runtime
),決定了依賴在項目生命周期哪個階段可用。
6.4總結
Maven 坐標是一個簡單而強大的尋址系統。理解它的每個部分意味著:
- 當你需要添加一個依賴時,你知道如何去網上(如 Maven Central Repository)查找正確的
groupId
,artifactId
和version
。 - 當你看到一段依賴配置時,你能立刻明白它引用的是哪個組織的哪個項目的哪個版本。
- 當出現依賴沖突時,你能根據坐標信息快速定位問題來源。
七、Maven 依賴配置超簡三步走
第 1 步:找到依賴項信息
當你想要在項目中使用某個第三方庫時,你需要知道它的 ??坐標(Coordinates)??,即三個信息:
-
groupId??
: 通常代表組織或項目組。 -
??
artifactId
??: 代表項目中的具體庫名。 -
??version
??: 庫的版本號。
??如何找到這些信息???
最直接的方法是去 Maven 中央倉庫https://mvnrepository.com/搜索。
-
打開網站,在搜索框輸入你想要的庫名,例如 Spring Context。
-
選擇一個穩定且常用的版本(版本號后面有 Usage柱狀圖的那個),點擊進去。
3. 頁面中會直接給出它的 Maven 配置代碼,復制即可。
第 2 步:將依賴項添加到 pom.xml
在你的 Maven 項目根目錄下,有一個最重要的文件叫 pom.xml。打開它,找到 <dependencies>
標簽。??所有的依賴項都要放在這個標簽里面??。如果還沒有這個標簽,就在 <project>
標簽內,自己創建它。把你從中央倉庫復制的代碼,粘貼到 <dependencies>
內部。
??示例:??
假設我們找到了 Jackson Databind版本 2.15.2,那么你的 pom.xml看起來應該是這樣的:
點擊刷新,看到maven這欄依賴項里面有就說明配置好了
第 3 步:排除依賴
如果需要某個依賴,但想??排除它帶來的特定子依賴??,使用 <exclusions>
標簽:
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.2.7</version><exclusions><!-- 排除不需要的子依賴 --><exclusion><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId></exclusion><exclusion><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId></exclusion></exclusions></dependency></dependencies>
再次刷新過后可以發現依賴項已經被刪除了
八、Maven 生命周期核心講解
Maven 的生命周期被設計得非常完善和有序,它包含了項目構建的所有環節。其核心思想是:生命周期由多個階段(Phase)組成,每個階段負責一個特定的任務,并且這些階段是按順序執行的。
1. 三大生命周期 (Lifecycle)
Maven 擁有三套相互獨立的生命周期:
clean
:清理生命周期,負責清除上次構建生成的文件(比如刪除target
目錄)。default
(或 build):構建生命周期,這是最核心的部分,負責編譯、測試、打包、部署等整個構建過程。site
:站點生命周期,負責生成項目報告、站點文檔等。
2. 生命周期階段 (Phase)
每個生命周期都由一系列按順序排列的階段構成。執行某個階段,會自動執行它之前的所有階段。
以最重要的 default
(構建)生命周期為例,其關鍵階段包括(按順序):
validate
:驗證項目是否正確且所有必要信息可用。compile
:編譯項目的源代碼。test
:使用單元測試框架(如 JUnit)運行測試。此階段不會要求打包或部署代碼。package
:將編譯后的代碼打包成可分發格式,如 JAR、WAR 包。verify
:對集成測試結果進行檢查,以確保滿足質量要求。install
:將打包好的軟件包安裝到本地倉庫,以便其他本地項目依賴使用。deploy
:在構建環境中完成,將最終的軟件包復制到遠程倉庫,以便其他開發者和項目共享。
3. 在IDEA里面使用Maven命令
以下面的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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>Maven2</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>21</maven.compiler.source><maven.compiler.target>21</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.2.7</version><exclusions><!-- 排除不需要的子依賴 --><exclusion><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId></exclusion><exclusion><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId></exclusion></exclusions></dependency></dependencies>
</project>
在IDEA右側的Lifestyle里面雙擊即可執行
以下是執行完package
之后的場景,會在target里面生成一個jar包
運行完install
之后可以在我們本地倉庫里面找到安裝好的jar包
此時我的 路徑為D:\apache-maven-3.9.11\mvn_repo\org\example\Maven2\1.0-SNAPSHOT
<groupId>org.example</groupId>
這行代碼里面的org.example
就是我們在本地倉庫里面需要找的路徑
4. 在終端里使用Maven命令
項目編譯與打包
命令 | 說明 |
---|---|
mvn compile | 編譯源代碼,生成 .class 文件到 target/classes 目錄 |
mvn test | 運行測試用例(會先自動執行 compile ) |
mvn package | 打包項目(會先執行 test ),生成 JAR/WAR 包到 target/ 目錄 |
mvn install | 安裝到本地倉庫(會先執行 package ),以便其他本地項目引用 |
mvn clean | 清理項目,刪除 target 目錄 |
mvn clean install | 最常用組合:先清理再安裝,確保是全新構建 |
跳過測試相關
命令 | 說明 |
---|---|
mvn install -DskipTests | 跳過測試,但會編譯測試代碼 |
mvn install -Dmaven.test.skip=true | 完全跳過測試,不編譯也不執行測試 |
依賴管理
命令 | 說明 |
---|---|
mvn dependency:tree | 顯示依賴樹,查看所有傳遞性依賴,排查 Jar 包沖突神器 |
mvn dependency:resolve | 解析依賴,下載所有依賴包 |
mvn dependency:purge-local-repository | 清理本地倉庫中當前項目的依賴緩存(慎用) |
其他實用命令
命令 | 說明 |
---|---|
mvn help:effective-pom | 查看有效 POM,顯示所有默認配置與自定義配置合并后的最終結果 |
mvn --version 或 mvn -v | 查看 Maven 版本信息 |
mvn <phase> -h 或 --help | 獲取幫助,例如 mvn install -h |