Maven(生命周期、POM、模塊化、聚合、依賴管理)詳解

Maven構建項目的生命周期

? ? 在Maven出現之前,項目構建的生命周期就已經存在,軟件開發人員每天都在對項目進行清理,編譯,測試,部署等工作,這個過程就是項目構建的生命周期。雖然大家都在不停的做構建工作,但公司與公司之間,項目與項目之間構建項目的方式有所不同。

? ? Maven對所有的構建過程進行了抽象和統一。Maven構建項目的生命周期包含了項目清理,初始化,編譯,測試,打包,集成測試,驗證,部署和站點生成等幾乎所有構建步驟

Maven的常用命令?

mvn clean:調用clean生命周期的clean階段,清理上一次構建項目生成的文件;
mvn compile :編譯src/main/java中的java代碼;
mvn test :編譯并運行了test中內容 ;
mvn package:將項目打包成可發布的文件,如jar或者war包;?
mvn install :發布項目到本地倉庫 ;

POM

pom(Project Object Model)指的是項目對象模型,用來描述當前的maven項目

Setting.xml文件主要用于配置maven的運行環境等一系列通用屬性,是全局級別的配置文件,而pom.xml文件主要描述項目的maven坐標,依賴關系,開發者需要遵循的規則,組織等與項目相關的因素,是項目級別的配置文件。

依賴管理

依賴導入

? ? 就是對jar包的管理,以往我們需要下載好xxxx.jar的jar包,粘貼到工程的lib目錄下面去,使用maven的依賴管理功能,想要引入某個包只需要導入maven的坐標即可(它會通過坐標找到對應的jar包并下載到本地的maven倉庫)。

maven中央倉庫地址:https://mvnrepository.com/

比方說我要導入junit的jar包,前往中央倉庫搜索:junit

可以選擇人數較多的版本:

隨后復制它的坐標:

將坐標復制到我們項目的pom.xml文件中(注意要在dependencies)標簽中:

依賴范圍設置

?在默認情況下,依賴可以在任何地方可用,可以通過<scope>標簽設置作用的范圍,作用范圍主要有三種:

  1. 主程序范圍有效(src/main)目錄范圍內
  2. 測試程序范圍內有效(src/test)目錄范圍內
  3. 是否參與打包(package指令范圍內)
依賴范圍編譯源碼編譯測試代碼測試運行運行項目示例
compileYYYYspring-web
test-YY-junit
provideYYY-servlet-api
runtime-YYYjdcb
systemYYY-本地的jar包

依賴版本維護

? ? 如果pom文件中引入的依賴太多,各種依賴又有不同的版本,為了統一維護版本,我們可以將依賴的版本號抽取出來進行統一管理。具體操作的步驟如下:

  1. 在pom.xml中使用<propeties>屬性定義jar包的版本。
  2. 在依賴的<version>中使用${}引入前面定義好的版本

依賴傳遞

當在項目中引入一個jar包時引入的jar包所依賴的jar也會跟著傳遞進來:

依賴沖突?

? ? 一個項目可能會依賴多個庫或模塊,而這些庫或模塊又可能會依賴同一個類庫的不同版本。當這些不同版本的類庫被同時引入時,就會發生依賴沖突。

? ? 比如使用Maven導入了一個Servlet的包,當項目部署到Tomcat后產生了jar包沖突,因為在Tomcat服務器內置了servlet的jar。這就會造成依賴沖突。

解決依賴沖突的方法

  1. 使用maven提供的依賴調節原則(自動)
  2. 排除依賴,排除依賴的jar包
  3. 鎖定版本
使用maven提供的依賴調節原則

第一聲明者優先原則:

在pom.xml文件中,先聲明哪個jar包,就以那個jar包為主。

路徑近者優先原則:

優先使用我們自己導入的jar包,依賴中傳遞的jar包排其次,直接依賴高于間接依賴。

排除依賴,排除依賴的jar包

在<dependency>內導入jar包時,使用<exclusions>標簽,在<exclusions>標簽內使用<exclusion>包含需要排除的標簽:

    <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.2.4.RELEASE</version><!-- 排除依賴的jar包 --><exclusions><exclusion><groupId>org.springframework</groupId><artifactId>spring-core</artifactId></exclusion></exclusions></dependency>
鎖定版本

使用<dependencyManagement>(與dependencies同級):

    <dependencyManagement><dependencies><dependency><groupId></groupId><artifactId></artifactId><version></version></dependency></dependencies></dependencyManagement>

設置好版本號后,無需在dependencies標簽內再設置version:

項目模塊化?

? ? Maven項目的模塊化是一種將大型項目拆分成多個獨立但相互關聯的模塊(Module)的方法。每個模塊負責一部分功能,這樣不僅可以提高項目的可維護性、可擴展性和可重用性,還能有效隔離各個模塊之間的依賴,簡化項目的管理。

Maven項目的繼承

? ? 在Java語言中,類之間是可以繼承的,通過繼承,子類就可以引用父類中非private的屬性和方法。同樣,在maven工程之間也可以繼承,子工程繼承父工程后,就可以使用在父工程中引入的依賴。繼承的目的是為了消除重復代碼。

被繼承的Maven工程是父工程,父工程的packaging的打包方式必須為pom

?基礎其他Maven工程為子過程,在pom.xml文件中通過parent標簽進行父工程繼承

?Maven項目的聚合

? ? 在maven父工程的pom.xml文件中可以使用<modules>標簽將其他maven工程聚合到一起,聚合的目的是為了進行統一操作。

?


示例:

先創建一個工程,將packaging配置為pom,使它成為父工程:

<?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.f</groupId><artifactId>father</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties></project>

在目錄下新建模塊web,子模塊的xml為:

可以看到自動有了parent標簽

<?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><parent><groupId>com.f</groupId><artifactId>father</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>web</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties></project>

此時父工程自動添加了?<modules>標簽:

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

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

相關文章

jenkins harbor安裝

Harbor是一個企業級Docker鏡像倉庫?。 文章目錄 1. 什么是Docker私有倉庫2. Docker有哪些私有倉庫3. Harbor簡介4. Harbor安裝 1. 什么是Docker私有倉庫 Docker私有倉庫是用于存儲和管理Docker鏡像的私有存儲庫。Docker默認會有一個公共的倉庫Docker Hub&#xff0c;而與Dock…

【Python網絡爬蟲筆記】10- os庫存儲爬取數據

os庫的作用 操作系統交互&#xff1a;os庫提供了一種使用Python與操作系統進行交互的方式。使用os庫來創建用于存儲爬取數據的文件夾&#xff0c;或者獲取當前工作目錄的路徑&#xff0c;以便將爬取的數據存儲在合適的位置。環境變量操作&#xff1a;可以讀取和設置環境變量。在…

微信小程序從后端獲取的圖片,展示的時候上下沒有完全拼接,有縫隙【已解決】

文章目錄 1、index.wxml2、index.js3、detail.detail為什么 .rich-text-style 樣式可以生效&#xff1f;1. <rich-text> 組件的特殊性2. 類選擇器的作用范圍3. 樣式優先級4. line-height: 0 的作用5. 為什么直接使用 rich-text 選擇器無效&#xff1f; 總結 上下兩張圖片…

Linux-apache虛擬主機配置筆記

一、 安裝apache 有需要的話&#xff0c;可以去查看具體的apache的安裝apache安裝https://blog.csdn.net/m0_68472908/article/details/139348739?spm1001.2014.3001.5501 都可以使用本地yum源搭建本地yum源搭建https://blog.csdn.net/m0_68472908/article/details/14385692…

常用vim命令行-linux008

Vim 是一款功能強大的文本編輯器&#xff0c;廣泛應用于編程、配置文件編輯以及日常文本處理。Vim 在其命令行模式下提供了豐富的操作命令&#xff0c;這些命令能夠大幅提升編輯效率。以下是 Vim 中常用的命令及操作的總結&#xff0c;覆蓋了 Vim 中的基本操作、查找、替換、文…

xshell連接虛擬機,更換網絡模式:NAT->橋接模式

NAT模式&#xff1a;虛擬機通過宿主機的網絡訪問外網。優點在于不需要手動配置IP地址和子網掩碼&#xff0c;只要宿主機能夠訪問網絡&#xff0c;虛擬機也能夠訪問。對外部網絡而言&#xff0c;它看到的是宿主機的IP地址&#xff0c;而不是虛擬機的IP。但是&#xff0c;宿主機可…

【Spring Boot集成Shiro指南】

Spring Boot集成Shiro指南 一、添加Maven依賴 首先&#xff0c;需要在Spring Boot項目的pom.xml文件中添加Shiro相關的依賴。例如&#xff1a; <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><ve…

SpringBoot使用Nacos進行application.yml配置管理

Nacos是阿里巴巴開源的一個微服務配置管理和服務發現的解決方案。它提供了動態服務發現、配置管理和 服務管理平臺。Nacos的核心功能包括服務發現、配置管理和動態服務管理&#xff0c;使得微服務架構下的服務治理 變得簡單高效。 Nacos的設計基于服務注冊與發現、配置管理、動…

Electron-Vite 項目搭建(Vue)

前提條件 Node.js: 確保已安裝 Node.js 版本 18 或更高版本 (推薦使用最新穩定版)。Vite: 確保 Vite 版本為 4.0 或以上。包管理工具: 推薦使用 pnpm&#xff0c;但也可以使用 npm 或 yarn。 安裝 Electron-Vite 首先&#xff0c;在項目中安裝 electron-vite 作為開發依賴&a…

STM32F103單片機HAL庫串口通信卡死問題解決方法

在上篇文章 STM32F103單片機使用STM32CubeMX創建IAR串口工程 中分享了使用cubeMX直接生成串口代碼的方法&#xff0c;在測試的過程中無意間發現&#xff0c;串口會出現卡死的問題。 當串口一次性發送十幾個數據的時候&#xff0c;串口感覺像卡死了一樣&#xff0c;不再接收數據…

【Neo4J】neo4j docker容器下的備份與恢復

文章目錄 一. 官網說明1. 操作說明2. 注意事項 二. docker 容器化操作1. 導出&#xff08;備份&#xff09;停止容器執行備份 2. 導入&#xff08;恢復&#xff09;停止容器(如果未停止)執行導入 3. 啟動容器 一. 官網說明 https://neo4j.com/docs/operations-manual/current/…

selenium自動爬蟲工具

一、介紹selenium爬蟲工具 selenium 是一個自動化測試工具&#xff0c;可以用來進行 web 自動化測試、爬蟲 selenium 本質是通過驅動瀏覽器&#xff0c;完全模擬瀏覽器的操作&#xff0c;比如跳轉、輸入、點擊、下拉等&#xff0c;來拿到網頁渲染之后的結果&#xff0c;可支持…

Unity開發數字孿生項目

前言&#xff1a;記錄下自己用Unity開發數字孿生項目&#xff0c;所用到的知識點、功能點以及對項目認知總結&#xff0c;當然還有開發過程中所遇到的坑。此篇博客也是會隨時進行更新。 &#x1f60a;屏幕前看到此片文章的開發者們在此類項目開發過程中少走些彎路&#xff0c;希…

node利用路由搭建web實例

npm init npm i express body-parser cookie-parser 封裝web實例 搭建路由 導出web 應用實例注冊

量化交易系統開發-實時行情自動化交易-8.25.真格(澎博財經旗下)平臺

19年創業做過一年的量化交易但沒有成功&#xff0c;作為交易系統的開發人員積累了一些經驗&#xff0c;最近想重新研究交易系統&#xff0c;一邊整理一邊寫出來一些思考供大家參考&#xff0c;也希望跟做量化的朋友有更多的交流和合作。 接下來會對于真格&#xff08;澎博財經…

QT JSON文件解析

參考博客 https://blog.csdn.net/cpp_learner/article/details/118421096 1 打開文件&#xff0c;讀取全部內容 QFile file("../Json/js.json"); if (!file.open(QFile::ReadOnly | QFile::Text)) {qDebug() << "cant open error!";return; }// 讀…

面試常見-Java 原生實現常見數據結構

Java 原生實現常見數據結構 文章目錄 Java 原生實現常見數據結構一、引言二、數組&#xff08;Array&#xff09;&#xff08;一&#xff09;概念&#xff08;二&#xff09;代碼實現 三、鏈表&#xff08;Linked List&#xff09;&#xff08;一&#xff09;概念&#xff08;二…

1. 機器學習基本知識(5)——練習題(參考答案)

20.&#x1f517;本章代碼筆記&#x1f4d3;鏈接&#xff08;需要&#x1fa9c;&#xff09;&#xff1a;&#xff08;01_the_machine_learning_landscape.ipynb - Colab (google.com)&#xff09; 如果你不想通過上面的官方網址下載本章的筆記&#xff0c;還可以在本篇博文的…

通常一個 Xml 映射文件,都會寫一個 Dao 接口與之對應, 請問,這個 Dao 接口的工作原理是什么?Dao 接口里的方法, 參數不同時,方法能重載嗎?

Dao 接口 即 Mapper 接口 。接口 的 全 限 名 &#xff0c;就是 映 射 文 件 中 的 namespace 的值 &#xff1b; 接口 的 方 法 名 &#xff0c; 就 是 映 射 文 件 中 Mapper 的 Statement 的 id 值&#xff1b; 接 口 方 法 內 的 參數 &#xff0c; 就 是 傳 遞 給 sql 的參…

硬件設計 | Altium Designer軟件PCB規則設置

基于Altium Designer&#xff08;24.9.1&#xff09;版本 嘉立創PCB工藝加工能力范圍說明-嘉立創PCB打樣專業工廠-線路板打樣 規則參考-嘉立創 注意事項 1.每次設置完規則參數都要點擊應用保存 2.每次創建PCB&#xff0c;都要設置好參數 3.可以設置默認規則&#xff0c;將…