深入理解 Maven POM 文件:核心配置詳解

前言

在 Java 開發領域,Apache Maven 是一個強大的項目管理和構建自動化工具。而pom.xml文件,作為 Maven 項目的“心臟”,定義了項目的方方面面。本文將帶你深入了解pom.xml最常用和最重要的配置項,幫助你快速掌握 Maven 的核心配置。

什么是 POM?

POM(Project Object Model,項目對象模型)是 Maven 的基本工作單元,以 XML 文件(pom.xml)的形式存在。它包含了項目構建、依賴、插件等所有信息。

核心配置項詳解

一個典型的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.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><!-- 1. 基本坐標信息 --><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>my-project</artifactId><version>1.0.0-SNAPSHOT</version><packaging>jar</packaging><!-- 2. 項目信息 --><name>My Project</name><description>A sample Maven project</description><url>https://example.com/my-project</url><!-- 3. 依賴管理 --><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.7.0</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency></dependencies><!-- 4. 屬性定義 --><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><spring-boot.version>2.7.0</spring-boot.version></properties><!-- 5. 構建配置 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.7.0</version></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>11</source><target>11</target></configuration></plugin></plugins></build><!-- 6. 依賴版本管理 (Dependency Management) --><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.7.0</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement></project>

1. 基本坐標 (GAV)

這是 POM 最核心的部分,用于唯一標識一個項目或依賴:

  • <groupId>: 組織或項目的唯一標識,通常使用反向域名(如 com.example)。
  • <artifactId>: 項目本身的名稱(如 my-project)。
  • <version>: 項目的版本號(如 1.0.0-SNAPSHOT)。SNAPSHOT表示開發中的快照版本。
  • <packaging>: 打包類型,常見值有 jar (默認), war, pom

2. 依賴管理 (<dependencies>)

這是 Maven 最強大的功能之一,用于聲明項目所依賴的庫。

<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.21</version><scope>compile</scope> <!-- 依賴范圍 --></dependency>
</dependencies>
  • 依賴范圍 (Scope): 控制依賴在不同階段的可用性:
    • compile (默認): 在編譯、測試、運行時都可用。
    • test: 僅在測試編譯和執行階段可用(如 JUnit)。
    • provided: 編譯和測試時需要,但運行時由 JDK 或容器提供(如 Servlet API)。
    • runtime: 編譯時不需要,但運行和測試時需要(如 JDBC 驅動)。
    • system: 類似 provided,但需要指定本地系統路徑(不推薦)。

3. 屬性 (<properties>)

用于定義可重用的變量,提高配置的可維護性。

<properties><java.version>11</java.version><spring.version>5.3.21</spring.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties><!-- 使用示例 -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version>
</dependency>

4. 構建配置 (<build>)

定義項目的構建過程,包括使用的插件。

  • <plugins>: 聲明構建過程中使用的 Maven 插件。
    • maven-compiler-plugin: 配置 Java 編譯器(源碼和目標版本)。
    • maven-surefire-plugin: 運行單元測試。
    • maven-jar-plugin / maven-war-plugin: 打包項目。
    • spring-boot-maven-plugin: 為 Spring Boot 應用提供打包和運行支持。

5. 依賴版本管理 (<dependencyManagement>)

這是管理大型項目或模塊化項目依賴版本的利器。

  • 在父 POM 或 BOM(Bill of Materials)中使用。
  • 聲明依賴的版本,但不直接引入依賴
  • 子模塊在 <dependencies> 中聲明相同 groupIdartifactId 的依賴時,可以省略 <version>,自動繼承 <dependencyManagement> 中定義的版本。
  • 常用于引入像 spring-boot-dependencies 這樣的 BOM,統一管理 Spring Boot 生態下所有組件的兼容版本。
<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.7.0</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

總結

pom.xml是 Maven 項目的配置中心。掌握其核心配置項:

  1. GAV 坐標:唯一標識項目和依賴。
  2. <dependencies>:聲明項目所需庫。
  3. <properties>:定義可復用的變量。
  4. <build>:配置構建過程和插件。
  5. <dependencyManagement>:集中管理依賴版本,確保一致性。

通過合理配置這些元素,你可以高效地管理 Java 項目的依賴、構建和發布流程。記住,一個清晰、規范的pom.xml是項目成功的基礎。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918232.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918232.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918232.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

嵌入式學習的第四十天-51單片機

一、基本框架第一階段&#xff1a;1980年、Intel英特爾MCS-51系列&#xff1a;8051型號單片機、工業控制領域、由MCU市場->CPU市場。1、CPU&#xff08;Central Processing Unit&#xff0c;中央處理單元&#xff09;?是計算機的核心部件&#xff0c;負責執行計算機指令和處…

Linux(17)——Linux進程信號(上)

目錄 一、信號速識 ??生活中的信號 ??技術上的信號 ??信號的發送和記錄 ??信號處理概述 二、產生信號 ??通過終端產生信號 ??通過函數發送信號 ??通過軟件產生信號 ??通過硬件產生信號 一、信號速識 ??生活中的信號 你在網上買了很多件商品&…

使用pytest對接口進行自動化測試

上篇博客中講述了什么是接口測試&#xff0c;已經自動化接口測試流程&#xff0c;這篇博客總結如何實現接口自動化測試&#xff08;一&#xff09;requestsrequests庫是Python對HTTP通信的一個工具&#xff0c;將http協議操作封裝成簡單的接口&#xff0c;能夠讓我們高效的編寫…

信息安全及防火墻總結

1.1 信息安全現狀及挑戰信息安全概述 信息安全&#xff1a;防止任何對數據進行未授權訪問的措施&#xff0c;或者防止造成信息有意無意泄漏、破壞、 丟失等問題的發生&#xff0c;讓數據處于遠離危險、免于威脅的狀態或特性。 網絡安全&#xff1a;計算機網絡環境下的信息安全。…

20250808組題總結

A - A Pak Chanek 有一個包含 nnn 個正整數的數組aaa。由于他正在學習如何計算兩個數字的向下取整平均值&#xff0c;他希望在他的數組 aaa 上進行練習。當數組 aaa 至少有兩個元素時&#xff0c;Pak Chanek 將執行以下三步操作&#xff1a; ?\bullet?選擇兩個不同的索引 ii…

【Python 語法糖小火鍋 · 第 5 涮 · 完結】

一、糖味一句話 Python 3.10 的 match-case 把「類型 值 嵌套」一次性拆開&#xff0c; 可讀性 10&#xff0c;bug 數 10&#xff0c;if-elif 可以安心退休了。二、1 行示例 3 連發 # ① 值匹配 match status:case 200: msg "ok"case 404: msg "not found&q…

寫 SPSS文件系統

寫入 SPSS 系統文件&#xff08;.sav、.zsav&#xff09; 以下為相關的 SPSS 命令&#xff08;以大寫形式 CAPS 呈現&#xff09; savFileName : str SPSS 數據文件的文件名 以 .sav 結尾的文件使用舊版壓縮方案壓縮。 以 _uncompressed.sav 結尾的文件不壓縮&#xff0c;這在需…

云服務器--阿里云OSS(1)【阿里云OSS簡單介紹以及環境準備】

一、阿里云OSS簡介 定義&#xff1a;阿里云OSS&#xff08;Object Storage Service&#xff09;是阿里云提供的對象存儲服務&#xff0c;支持海量數據的存儲和管理。 存儲方式&#xff1a;基于“對象存儲”&#xff0c;文件以對象形式存儲&#xff0c;無需管理文件系統結構。 …

R語言代碼加密(1)

1、使用Compiler包library(compiler) cmpfile("1.R")#實現對R腳本的整體加密 compiler::loadcmp("1.Rc")#調用R腳本存在問題是&#xff0c;該方法僅對腳本進行加密。在加載生成的Rc文件后&#xff0c;腳本內具體函數&#xff0c;是可以看到具體內容的。針對…

【面試場景題】通過LinkedHashMap來實現LRU與LFU

文章目錄一、LRU與LFU的概念1. LRU&#xff08;Least Recently Used&#xff0c;最近最少使用&#xff09;2. LFU&#xff08;Least Frequently Used&#xff0c;最不經常使用&#xff09;二、LinkedHashMap的特性三、用LinkedHashMap實現LRU實現代碼&#xff1a;原理說明&…

第5章 Excel公式與函數應用指南(2):數學函數

5.2 數學函數 Excel作為強大的數據處理工具,其內置的數學函數體系為用戶提供了豐富的計算能力。從基礎的四則運算到復雜的指數對數計算,從簡單的數值舍入到專業的矩陣運算,Excel的數學函數幾乎可以滿足各類計算需求。 本節將重點為您解析七個常用且實用的數學函數:求和函…

mysql復制連接下的所有表+一次性拷貝到自己的庫

1.導出鏈接下的所有數據mysqldump -h 地址 -u 數據庫名 -p --all-databases --single-transaction --master-data2 > all_dbs.sql2.導入自己的庫mysql -h 127.0.0.1 -u root -p < all_dbs.sql3.指定導出某些庫mysqldump -u root -p --databases db1 db2 db3 > /path/t…

開發手札:UnrealEngine和Unity3d坐標系問題

最近把一套網絡模塊和一套組件模塊從u3d改造到ue4。網絡模塊通用性很高&#xff0c;畢竟協議都是通用網絡協議&#xff0c;改造后沒啥問題。但是改造組件模塊的時候就遇到了問題。首先&#xff0c;unity3d的坐標系是標準左手坐標系&#xff0c;如下&#xff1a;同時自己的幾何算…

QML 鼠標穿透

事件&#xff1a; 有一個輸入框(TextField)&#xff0c;需要實現鼠標懸浮時改變邊框顏色&#xff0c;鼠標移出后恢復原來邊框顏色&#xff1b; 這時如果需要實現此功能&#xff0c;就得使用到MouseArea&#xff0c;鼠標操作區域填充滿整個TextField。 然后實現鼠標移入移入出的…

VR 設備 PCB 怎樣憑借高頻材料達成高速傳輸

VR 設備的沉浸式體驗依賴于高分辨率圖像與低延遲交互&#xff0c;這要求設備內部數據傳輸速率達到 10Gbps 以上&#xff0c;而印制線路板&#xff08;PCB&#xff09;作為信號傳輸的核心載體&#xff0c;其材料性能直接決定傳輸效率。高頻材料憑借低介電常數&#xff08;Dk&…

Oracle字段操作

1. 新增字段 -- 新增字段 ALTER TABLE MES.WT_SUPPLEMENT_RECORD ADD (PAR_ATTR3 NUMBER DEFAULT NULL);2. 修改字段類型 -- 修改字段類型 ALTER TABLE MES.WT_SUPPLEMENT_RECORD MODIFY (PAR_ATTR3 VARCHAR2(32));3. 刪除字段 -- 刪除字段 ALTER TABLE MES.WT_SUPPLEMENT_RECO…

【原創】基于 Flask 的簡單文件收集器

在單位內網環境中&#xff0c;我經常需要收集 pdf 格式的記錄表。于是我基于 ai ide&#xff0c;開發了一個基于 Flask 開發的輕量級文件上傳服務項目&#xff0c;部署在單位飛騰芯的銀河麒麟系統上&#xff08;當然由于 python 的跨平臺&#xff0c;在 windows 和 mac 上也可部…

學習Java的Day28

今天在昨天完成的留言板項目基礎上&#xff0c;我進一步開發了一個酒店房型管理系統。該系統采用MVC架構&#xff0c;主要功能是對酒店房型信息進行增刪改查操作。數據庫設計方面&#xff0c;我創建了hotel_room_type表&#xff0c;包含以下字段&#xff1a;id&#xff1a;主鍵…

Leetcode——556. 下一個更大元素 III

題目鏈接&#xff1a;556. 下一個更大元素 III &#xff08;由于圖片上傳失敗&#xff0c;不貼原題目了&#xff0c;有需要可以前往力扣查看&#xff09; 本文給出該題的單調棧做法&#xff0c;同時繞過所有庫函數&#xff0c;所有邏輯均自行實現。 本題的思路就是從右向左按…

Idea打包可執行jar,MANIFEST.MF文件沒有Main-Class屬性:找不到或無法加載主類

背景&#xff1a;IDEA傳統方法【Project structure】-->artifact---->build的模式&#xff0c;打包【Maven】項目&#xff0c;發現生成的可執行jar包&#xff0c;顯示【找不到或無法加載主類】。但是用【Maven】的Assembly可以正常生成。期望用傳統方法實現打jar包方法&a…