Maven 繼承:構建高效項目結構的利器

一、引言

Maven 是一個強大的項目管理工具,它通過標準化的項目結構和依賴管理極大地簡化了 Java 項目的開發流程。在 Maven 中,繼承是一種非常有用的功能,它允許我們創建一個父項目,其他子項目可以繼承這個父項目的配置信息,從而實現配置的一致性和復用性。本文將詳細介紹 Maven 繼承的概念,并提供一個通俗易懂的例子來幫助大家更好地理解和應用這一功能。

二、Maven 繼承概述

2.1 父 POM(Project Object Model)

父 POM 是 Maven 項目中的一個特殊類型的 POM 文件,它定義了一組通用的配置項,如依賴管理、插件配置等。這些配置可以被多個子項目繼承和使用。

2.2 子 POM

子 POM 是指那些繼承自父 POM 的 POM 文件。它們可以覆蓋或擴展父 POM 中定義的配置,以滿足特定項目的需求。

2.3 繼承的優勢

  • 配置復用:避免重復配置,提高工作效率。
  • 統一管理:集中管理公共配置,便于維護。
  • 版本控制:確保所有子項目使用相同的依賴版本,減少兼容性問題。

三、Maven 繼承的實際應用

3.1 創建父 POM

首先,我們需要創建一個父 POM 項目。父 POM 項目的pom.xml文件應該包含所有子項目共有的配置信息。例如:

<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.example</groupId><artifactId>parent-project</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><properties><java.version>1.8</java.version><spring.boot.version>2.5.4</spring.boot.version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>${spring.boot.version}</version></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>${java.version}</source><target>${java.version}</target></configuration></plugin></plugins></build>
</project>

在這個例子中,我們定義了一個父 POM 項目,其中包含了 Spring Boot Web Starter 依賴的版本管理和 Maven 編譯插件的配置。

3.2 創建子 POM

接下來,我們可以創建一個子項目,讓它繼承父 POM 的配置。子項目的pom.xml文件需要指定其父項目的信息,并且可以根據需要添加額外的配置。例如:

<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><parent><groupId>com.example</groupId><artifactId>parent-project</artifactId><version>1.0-SNAPSHOT</version><relativePath>../parent-project/pom.xml</relativePath></parent><artifactId>child-project</artifactId><name>Child Project</name><description>Demo project for Spring Boot</description><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
</project>

在這個子項目中,我們指定了父項目的groupIdartifactIdversion,并通過<relativePath>標簽指明了父 POM 文件的位置。這樣,子項目就可以直接使用父 POM 中定義的依賴管理和插件配置,而無需再次聲明。

好的,以下是擴展后的博客內容,新增了版本控制依賴管理的細節以及繼承與聚合的關系等內容,供你更新到 maven-inherit.md 文件中:


四、Maven 繼承中的版本控制

4.1 使用 <properties> 統一版本號

在實際開發中,多個子模塊可能需要使用相同版本的庫。通過 Maven 的 <properties> 標簽,我們可以在父 POM 中統一定義版本號,子項目直接引用即可。

<properties><spring.version>5.3.9</spring.version><junit.version>4.13.2</junit.version>
</properties>

然后在依賴中使用:

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version>
</dependency>

這樣可以避免版本混亂,并且便于統一升級。

4.2 <dependencyManagement> 的作用

<dependencyManagement> 是父 POM 中用于聲明依賴版本的地方,它并不會真正引入依賴,而是為子項目提供一個“模板”。子項目只需聲明 groupIdartifactId,Maven 會自動匹配父 POM 中定義的版本。

父 POM:

<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId><version>2.5.4</version></dependency></dependencies>
</dependencyManagement>

子 POM:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency>
</dependencies>

五、插件統一配置

除了依賴管理,Maven 還支持在父 POM 中統一配置插件(plugins),如編譯插件、打包插件等。

示例:統一 Java 編譯版本

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>${java.version}</source><target>${java.version}</target></configuration></plugin></plugins>
</build>

子項目可以直接繼承這些插件配置,也可以根據需要覆蓋特定配置。

六、多層級繼承

Maven 支持多級繼承,即父 POM 本身也可以繼承另一個更上層的 POM。這在大型組織或企業中非常常見,比如公司有一個通用的基礎 POM,每個業務線再定義自己的父 POM,最后才是具體的應用模塊。

結構示意:

base-pom (最基礎)
└── business-pom (繼承 base-pom)└── app-module (繼承 business-pom)

這種結構可以讓配置更加模塊化和可維護。

七、聚合與繼承的區別與聯系

對比項聚合(Aggregation)繼承(Inheritance)
目的管理多個子模塊復用配置
使用標簽<modules><parent>
是否必須
常見場景多模塊項目構建統一依賴/插件配置

通常在一個多模塊項目中,我們會同時使用聚合和繼承來實現項目的高效管理。

示例聚合配置:

<modules><module>child-project1</module><module>child-project2</module>
</modules>

八、總結

Maven 繼承機制是構建復雜項目結構的重要手段之一。通過合理的父子結構設計,我們可以:

  • 統一依賴版本,減少沖突;
  • 集中管理插件配置;
  • 實現多層級的配置復用;
  • 結合聚合功能實現模塊化開發。

合理地使用 Maven 繼承不僅可以提高開發效率,還能顯著提升項目的可維護性和一致性。

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

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

相關文章

Mysql組合索引的update在多種情況下的間隙鎖的范圍(簡單來說)

簡單來說&#xff0c;當 UPDATE 語句的 WHERE 條件使用了組合索引&#xff0c;并且需要鎖定不存在的“間隙”來防止幻讀時&#xff0c;就會產生間隙鎖。間隙鎖的范圍取決于 WHERE 條件如何利用組合索引&#xff0c;以及數據庫的隔離級別。 我們用圖書館的例子。比如&#xff1a…

什么是Apache Ignite的affinity(親和性)

在 Apache Ignite 中&#xff0c; affinity&#xff08;親和性&#xff09; 是一種用于控制數據分布和查詢性能的重要機制。它允許開發者指定數據如何在集群中的節點之間分布&#xff0c;從而優化數據訪問和查詢效率。以下是關于 affinity 的詳細解釋&#xff1a;數據親和性&a…

youtube圖論

dfs排序lifo & fifo存儲方式鄰接矩陣dijstra處理過的保存/更新&#xff0c;意味著一個節點避免了重復訪問bfs dfs

借助ssh實現web服務的安全驗證

背景 公有云服務器 http 服務 80端口&#xff0c;想做到安全訪問無須HTTPS 客戶端證書方便、快捷、安全 SSH 隧道 本地代理 使用 SSH 隧道將 HTTP 服務“隱藏”在 SSH 之后&#xff1a; # 客戶端建立隧道&#xff08;將本地 8080 轉發到服務器的 80 端口&#xff09; ssh…

狀態機在前端開發中的藝術:從理論到框架級實踐

文章目錄一 狀態機&#xff1a;復雜邏輯的終結者1.1 什么是狀態機&#xff1f;1.2 為何前端需要狀態機&#xff1f;二 狀態機核心概念深度解析2.1 有限狀態機&#xff08;FSM&#xff09;與分層狀態機&#xff08;HSM&#xff09;2.2 狀態機的數學表示三 前端開發中的狀態機實戰…

把word中表格轉成excle文件

把word中表格轉成excle文件 from docx import Document from openpyxl import Workbook from pathlib import Path# 打開 Word 文檔 document Document(./weather_report.docx) tables document.tables# 輸出文件路徑 output_file Path(./weather_report.xlsx)# 如果文件已存…

運維打鐵: 阿里云 ECS 實例的高效運維與管理

文章目錄思維導圖正文內容一、實例基礎管理1. 實例創建2. 實例配置調整3. 實例停止與啟動二、性能監控與優化1. 系統性能指標監控2. 磁盤 I/O 優化3. 網絡優化三、安全防護1. 防火墻設置2. 賬號安全管理3. 數據備份與恢復四、自動化運維1. 腳本自動化2. 使用云助手五、成本優化…

RV1126平臺(Buildroot Linux)+ SunplusIT SPCA2688 USB攝像頭 RTSP推流全流程復盤與問題解決記錄

# RK RV1126平臺&#xff08;Buildroot Linux&#xff09; SunplusIT SPCA2688 USB攝像頭 RTSP推流全流程復盤與問題解決記錄一、平臺與需求- **硬件平臺**&#xff1a;Rockchip RV1126 - **操作系統**&#xff1a;基于Buildroot定制的Linux系統 - **USB攝像頭**&#xff1a;Su…

深入理解Java虛擬機:Java內存區域與內存溢出異常

前言Java虛擬機&#xff08;JVM&#xff09;的自動內存管理是其核心特性之一&#xff0c;它極大地簡化了開發者的工作&#xff0c;減少了內存泄漏和內存溢出的問題。本文將詳細介紹JVM的自動內存管理機制的內存區域與內存溢出異常問題&#xff0c;包括運行時數據區域、對象的創…

位圖入門算法191. 位1的個數

題目鏈接&#xff1a; 191. 位1的個數 - 力扣&#xff08;LeetCode&#xff09; 這道題讓我們找出一個數字中二進制中1的個數&#xff0c;這個題目我們就用1的&來解決&#xff0c;最后一位有0為0&#xff0c;都是1才是1&#xff0c;我們只需要判斷32次即可。 代碼如下&am…

[架構之美]虛擬機Ubuntu密碼重置

[架構之美]虛擬機Ubuntu密碼重置 當您在虛擬機中運行Ubuntu系統時&#xff0c;忘記密碼不再意味著數據丟失&#xff01;本文將詳細介紹可靠的密碼重置方法&#xff0c;幫助您快速恢復系統訪問權限。 一、虛擬機密碼重置原理與準備 1.1 為什么虛擬機重置密碼更容易 在虛擬機環…

kotlin中withContext,async,launch幾種異步的區別

在 Kotlin 協程中&#xff0c;withContext、async 和 launch 是常用的異步/并發操作函數&#xff0c;它們的主要區別在于用途和返回值&#xff1a;1. launch 作用&#xff1a;啟動一個新的協程&#xff0c;用于執行不返回結果的并發任務。使用場景&#xff1a;適合執行沒有返回…

git 報錯fatal: refusing to merge unrelated histories

解決方案在你操作命令后面加--allow-unrelated-histories 例如&#xff1a; git merge master --allow-unrelated-historiesgit pull或者git push報fatal: refusing to merge unrelated histories 同理&#xff1a; git pull origin master --allow-unrelated-histories

Android 13----在framworks層映射一個物理按鍵

基于Android 13.一、映射步驟確定要映射的物理按鍵值在kl文件中增加鍵值對在InputEventLabels.cpp增加AKEYCODE在keycodes.h中定義AKEYCODE值attrs.xml中增加KEYCODEKeyEvent.java中增加KEYCODE在PhoneManagerWindow等相關類中進行攔截處理相關KEYCODE&#xff0c;屬于具體的業…

【Java EE】Mybatis-Plus

1. 開始先進行和以前一樣的項目配置、數據庫連接配置&#xff0c;在這些基礎上&#xff0c;額外引入 Mybatis-Plus 依賴即可。<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><vers…

各版本操作系統對.NET支持情況(250707更新)

借助虛擬機和測試機&#xff0c;檢測各版本操作系統對.NET的支持情況。 安裝操作系統后&#xff0c;安裝相應運行時并能夠運行星塵代理或幸運四葉草為通過條件。 測試平臺&#xff1a;VMware Workstation 鏡像來源&#xff1a;MSDN I Tell You 參考&#xff1a; .NET Fram…

5-Kafka-replication(副本機制)概念

&#x1f504; Kafka 副本機制&#xff08;Replication&#xff09; 核心概念概念說明Replica (副本)分區的完整拷貝&#xff0c;分布在不同 BrokerReplication Factor副本總數&#xff08;含 Leader&#xff09;&#xff0c;生產環境建議 ≥3Leader Replica處理所有讀寫請求&a…

langgraph的ReAct應用

一、什么是langgraph的ReActLangGraph 中的 ReAct&#xff08;Reasoning Acting&#xff09;代理是一種結合推理與行動能力的 AI 代理架構&#xff0c;通過動態決策鏈實現復雜任務處理。以下是其核心要點及實踐指南。1、ReAct 代理的核心原理1.1工作流程&#xff1a;ReAct 代理…

一個編輯功能所引發的一場知識探索學習之旅(JavaScript、HTML)

文章目錄一個編輯功能所引發的一場知識探索學習之旅&#xff08;JavaScript、HTML&#xff09;1. 一個編輯功能案例2. 知識點探索學習3. 參考資料一個編輯功能所引發的一場知識探索學習之旅&#xff08;JavaScript、HTML&#xff09; 1. 一個編輯功能案例 HTML&#xff1a; &l…

kali制作Windows木馬

環境描述&#xff1a;攻擊機&#xff1a;Kali-2025實驗靶機&#xff1a;Windows11不要攻擊他人&#xff0c;這只是網絡安全實驗還是一樣獲取IP地址制作好之后開服務&#xff0c;上傳下載在靶機右鍵保留下載記得把防火墻&#xff0c;安全中心關了否則無法下載之后就可以kali控制…