maven介紹和作用
Maven 是一款為 Java 項目構建管理、依賴管理的工具(軟件),使用 Maven 可以自動化構建、測試、打包和發布項目,大大提高了開發效率和質量。
主要作用的理解:
依賴管理:
在編寫項目時我們需要許多第三方依賴,有maven后子需要將依賴項的信息編寫到Maven工程的配置文件,Maven軟件會自動下載并復制這些依賴到項目中,也會自動下載依賴所需要的依賴(確保依賴版本無誤)
構建管理:
項目開發后想要將項目打包成.war文件,并部署到服務器中運行;使用maven可以通過一行構建命令(mvn package)快速構建和打包
idea也可以構建項目,為什么要使用maven呢?
原因1:maven構建觸發方便
原因2:開發項目的軟件有很多,每個軟件的項目結構都不相同,使用maven構建可以統一結構
Packaging定義規則:
? 指示將項目打包為什么類型的文件,idea根據packaging值,識別maven項目類型!
? packaging 屬性為 jar(默認值),代表普通的Java工程(Java類文件,資源文件),打包以后是.jar結尾的文件。
? packaging 屬性為 war,代表Java的web工程(Java文件,jsp文件,html/cssjs文件,配置文件),打包以后.war結尾的文件。
? 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>
? <!--gavp屬性,不會改變-->
? <groupId>com.atguigu</groupId>
? <artifactId>maven-javase-project-02</artifactId>
? <!--構建過程,部署時修改-->
? <version>1.0-SNAPSHOT</version>
??<!--maven工程的打包方式 java jar[默認值]; web war;? 不打包 pom-->
? <packaging>war</packaging>
? <!--第三方依賴信息
? dependencies?? -項目依賴信息的集合
???? dependency?? -每個依賴項
??????? [gav]???? -依賴的信息就是其他被打包成maven的工程(該工程被打包成jar)
???? 如何知道第三方依賴的信息呢?
???? 1 使用官網查詢 http://mvnrepository.com
???? 2 使用插件 maven-search
???????? 點擊tools(工具) -maven-search 直接搜索插件即可
????
???? 擴展:
???? 1 提取版本號統一管理(自定義一個標簽提取版本號到該標簽)————————properties<>中設置
???? 2 可選屬性scope——————設置在dependency中(標明依賴可以使用的范圍)
???????? scope————引入依賴的作用
???????? 默認是compile? 代表該依賴可以在main中使用,也可以在test中使用,在打包和運行時都有效
???????? 設置為test 該依賴只能在test中使用(例如單元測試方法的依賴)
???????? 設置為runtime? main中不會用,test不會用 在打包和運行時會使用(一般是反射的時候使用)
???????????????????????????? 例如:mysql Class.format(com.mysql.cj.jdbc.Driver)
???????? 設置為provided?? 在main中會使用,在test中會使用,在打包和運行時會使用? 例如:Servlet??????
???? 總結:scope是一種錦上添花的手段,如果掌握不好,就全部默認值????????????????
????????
? -->
? <!--聲明版本號-->
? <properties>
??? <!--統一管理
??? 聲明一個變量來接收版本號,變量聲明以后,在其他位置可以引用 ${jackson.version(變量名)}
??? 注意:聲明的標簽建議兩層以上命名,推薦 技術名.version
??? -->
??? <jackson.version>2.18.2</jackson.version>
? </properties>
? <dependencies>
??? <dependency>
????? <!--定位信息gav三個屬性是必須的-->
????? <groupId>com.fasterxml.jackson.core</groupId>
????? <artifactId>jackson-core</artifactId>
????? <version>${jackson.version}</version>
????? <scope>compile</scope>
??? </dependency>
??? <dependency>
????? <groupId>junit</groupId>
????? <artifactId>junit</artifactId>
????? <version>4.13.2</version>
????? <scope>test</scope>
??? </dependency>
? </dependencies>
</project>
依賴傳遞與依賴沖突
**依賴傳遞**指的是當一個模塊或庫 A 依賴于另一個模塊或庫 B,而 B 又依賴于模塊或庫 C,那么 A 會間接依賴于 C。這種依賴傳遞結構可以形成一個依賴樹。當我們引入一個庫或框架時,構建工具(如 Maven、Gradle)會自動解析和加載其所有的直接和間接依賴,確保這些依賴都可用。
?????????? 依賴傳遞:導入依賴會自動導入依賴的依賴!(compile dependenices)
????????????????????? 簡化依賴的導入,確保依賴的版本無沖突
?????????? 依賴沖突:發現要導入已經存在的依賴(重復依賴)會終止依賴傳遞!避免循環依賴和重復依賴問題
?????????? 依賴沖突發生場景:重復依賴
?????????? 例如
???????????????? A——需要 B 1.0
???????????????? C——需要 B 2.0
??????????? 現要導入A與C依賴那么B應該是那個版本
??????????? 依賴沖突解決原則:
??????????? 第一原則:誰短誰優先(看應用的路徑長度)
??????????? A-C-B1.0
??????????? F-B2.0
??????????? 那么導入的應該是 A C F B2.0
??????????? 第二原則:誰上誰優先(看dependencies聲明的先后順序)
??????????? A-B1.0
??????????? F-B2.0
??????????? 那么導入應該是A,F,B1.0
??????????? 注意:只要發生沖突了,后續的依賴傳遞全部終止? ??
??????????? 前提:
???????????????? A 1.1 -> B 1.1 -> C 1.1
???????????????? F 2.2 -> B 2.2
??????????? pom聲明:
?????????????????????? F 2.2
?????????????????????? A 1.1??
?????????????????????? B 2.2
???????????? 那么會得到F2.2,B2.2,A1.1 (不會引入C1.1,只要發生沖突了,后續的依賴傳遞全部終止!)?
依賴傳遞的作用是:---------------------------------自動導入依賴的依賴
1. 減少重復依賴:當多個項目依賴同一個庫時,Maven 可以自動下載并且只下載一次該庫。這樣可以減少項目的構建時間和磁盤空間。
2. 自動管理依賴: Maven 可以自動管理依賴項,使用依賴傳遞,簡化了依賴項的管理,使項目構建更加可靠和一致。
3. 確保依賴版本正確性:通過依賴傳遞的依賴,之間都不會存在版本兼容性問題,確實依賴的版本正確性
依賴沖突-------------------------當發生重復依賴導入會終止依賴傳遞
maven自動解決依賴沖突問題能力,會按照自己的原則,進行重復依賴選擇
依賴下載失敗解決方案
解決方案:
1. 檢查網絡連接和 Maven 倉庫服務器狀態。
2. 確保依賴項的版本號與項目對應的版本號匹配,并檢查 POM 文件中的依賴項是否正確。
3.清除本地 Maven 倉庫緩存 (lastUpdated 文件),因為只要存在lastupdated緩存文件,刷新也不會重新下載。本地倉庫中,根據依賴的gav屬性依次向下查找文件夾,最終刪除內部的文件,刷新重新下載即可!
?構建管理
構建概念:
項目構建是指將源代碼、依賴庫和資源文件等轉換成可執行或可部署的應用程序的過程,在這個過程中包括編譯源代碼、鏈接依賴庫、打包和部署等多個步驟。
主動觸發場景:
- 重新編譯 : 編譯不充分, 部分文件沒有被編譯!
- 打包 : 獨立部署到外部服務器軟件,打包部署
- 部署本地或者私服倉庫 : maven工程加入到本地或者私服倉庫,供其他工程使用
構建步驟
命令方式構建:
語法: mvn 構建命令? 構建命令....
注意:
1命令執行需要我們進入到項目的根路徑
2部署必須時jar包形式
可視化方式構建.
構建命令周期:觸發周期后的命令會自動觸發同一周期前的命令!
作用:是一種簡化觸發構建命令過程
是一個有序的構建命令容器
清理周期:clean
構建周期:compile? test? package? install/deploy
報告周期: site
例如:想要打包,就直接package即可,不需要compile? test? package? (因為會自動觸發執行compile與test 但不會觸發clean ) 故而打包的最佳方案應是mvn clean package
我們執行的是周期命令
繼承與聚合
繼承特性的理解
繼承概念:
Maven 繼承是指在 Maven 的項目中,讓一個項目從另一個項目中繼承配置信息的機制。繼承可以讓我們在多個項目中共享同一配置信息,簡化項目的管理和維護工作。
繼承作用
??? 作用:在父工程中統一管理項目中的依賴信息,進行統一版本管理!
??? 它的背景是:
??? - 對一個比較大型的項目進行了模塊拆分。
??? - 一個 project 下面,創建了很多個 module。
??? - 每一個 module 都需要配置自己的依賴信息。
??? 它背后的需求是:
??? - 多個模塊要使用同一個框架,它們應該是同一個版本,所以整個項目中使用的框架版本需要統一管理。
??? 通過在父工程中為整個項目維護依賴信息的組合既保證了整個項目使用規范、準確的 jar 包;又能夠將以往的經驗沉淀下來,節約時間和精力。
例如:
在一個父工程下不同子工程需要同一個依賴的版本不同;可以在父工程中聲明版本,
思路一:直接在父工程中引入依賴<dependenies <denpendency gav(會出現子工程會將不需要的依賴也導入進來)
思路二:父工程引入依賴,只做依賴版本的聲明 <dependeniesManagement? <dependenies <denpendency gav(專門為版本管理聲明,不會正真導入依賴,只會做一個配置的聲明)---------------------------在子工程中導入依賴時就只需要寫ga即可不需要再聲明版本了
聚合關系實現和作用
1. 聚合概念------------------------------------(統一構建:在父工程中構建就可以觸發子工程)
??? Maven 聚合是指將多個項目組織到一個父級項目中,通過觸發父工程的構建,統一按順序觸發子工程構建的過程!!
2. 聚合作用
??? 1. 統一管理子項目構建:通過聚合,可以將多個子項目組織在一起,方便管理和維護。
??? 2. 優化構建順序:通過聚合,可以對多個項目進行順序控制,避免出現構建依賴混亂導致構建失敗的情況。