目錄
一、maven簡介
二、GAVP屬性
三、基于 IDLE 的 Maven 工程創建
1)java標準工程(Javase)的創建
2)java企業工程(Javaee)的創建
a)手動創建
b)插件方式創建(file / settings / plugins / marketplace)
四、Maven工程項目結構說明
五、依賴管理和配置
六、依賴傳遞和依賴沖突(不用管,就是一種原理說明,總之用maven導入總是對的)
七、依賴導入失敗場景和解決方案
八、構建概念
九、繼承與聚合
1、繼承語法
2、父工程依賴統一管理
3、聚合概念
4、聚合作用
5、聚合語法
6、聚合演示
十、總結
一、maven簡介
Maven 是一款為 Java 項目構建管理、依賴管理的工具(軟件),使用 Maven 可以自動化構建、測試、打包和發布項目,大大提高了開發效率和質量。
二、GAVP屬性
Maven工程相對之前的工程,多出一組gavp屬性,gav需要我們在創建項目的時指定,p有默認值,后期通過配置文件修改。
既然要填寫的屬性,我們先行了解下這組屬性的含義!
Maven 中的 GAVP 是指 GroupId、ArtifactId、Version、Packaging 等四個屬性的縮寫,其中前三個是必要的,而 Packaging 屬性為可選項。
這四個屬性主要為每個項目在maven倉庫總做一個標識,類似人的《姓-名》。有了具體標識,方便maven軟件對項目進行管理和互相引用!
GAV遵循一下規則:
1) GroupID 格式:com.{公司/BU }.業務線.[子業務線],最多 4 級。
??? 說明:{公司/BU} 例如:alibaba/taobao/tmall/aliexpress 等 BU 一級;子業務線可選。
??? 正例:com.taobao.tddl 或 com.alibaba.sourcing.multilang? com.atguigu.java
2) ArtifactID 格式:產品線名-模塊名。語義不重復不遺漏,先到倉庫中心去查證一下。
??? 正例:tc-client / uic-api / tair-tool / bookstore
3) Version版本號格式推薦:主版本號.次版本號.修訂號 1.0.0
??? 1) 主版本號:當做了不兼容的 API 修改,或者增加了能改變產品方向的新功能。
??? 2) 次版本號:當做了向下兼容的功能性新增(新增類、接口等)。
??? 3) 修訂號:修復 bug,沒有修改方法簽名的功能加強,保持 API 兼容性。
? ??例如: 初始→1.0.0? 修改bug → 1.0.1? 功能調整 → 1.1.1等
Packaging定義規則:
? 指示將項目打包為什么類型的文件,idea根據packaging值,識別maven項目類型!
? packaging 屬性為 jar(默認值),代表普通的Java工程,打包以后是.jar結尾的文件。
? packaging 屬性為 war,代表Java的web工程,打包以后.war結尾的文件。
? packaging 屬性為 pom,代表不會打包,用來做繼承的父工程。
三、基于 IDLE 的 Maven 工程創建
1)java標準工程(Javase)的創建
先創建一個空項目,方便以后把所有項目都放在該目錄之下
再new一個新的module
Javase創建完畢(注意:此處省略了version,直接給了一個默認值<version>1.0-SNAPSHOT</version>。自己后期可以在項目中隨意修改!)
2)java企業工程(Javaee)的創建
a)手動創建
創建一個javase maven工程
手動添加web項目結構文件
最后進行刷新和校驗
項目的webapp文件夾出現小藍點,代表成功!!
b)插件方式創建(file / settings / plugins / marketplace)
創建一個javase maven工程
右鍵、使用插件快速補全web項目
若小藍點沒出來,重啟ldea就行。
四、Maven工程項目結構說明
Maven 是一個強大的構建工具,它提供一種標準化的項目結構,可以幫助開發者更容易地管理項目的依賴、構建、測試和發布等任務。
以下是 Maven Web 程序的文件結構及每個文件的作用:
- pom.xml:Maven 項目管理文件,用于描述項目的依賴和構建配置等信息。
- src/main/java:存放項目的 Java 源代碼。
- src/main/resources:存放項目的資源文件,如配置文件、靜態資源等。
- src/main/webapp/WEB-INF:存放 Web 應用的配置文件。
- src/main/webapp/index.html:Web 應用的入口頁面。
- src/test/java:存放項目的測試代碼。
- src/test/resources:存放測試相關的資源文件,如測試配置文件等。
五、依賴管理和配置
Maven 依賴管理是 Maven 軟件中最重要的功能之一。Maven 的依賴管理能夠幫助開發人員自動解決軟件包依賴問題,使得開發人員能夠輕松地將其他開發人員開發的模塊或第三方框架集成到自己的應用程序或模塊中,避免出現版本沖突和依賴缺失等問題。
我們通過定義 POM 文件,Maven 能夠自動解析項目的依賴關系,并通過 Maven 倉庫自動下載和管理依賴,從而避免了手動下載和管理依賴的繁瑣工作和可能引發的版本沖突問題。
重點: 編寫pom.xml文件!
maven項目信息屬性配置和讀取:
<!-- 模型版本 --><modelVersion>4.0.0</modelVersion><!-- 公司或者組織的唯一標志,并且配置時生成的路徑也是由此生成, 如com.companyname.project-group,maven會將該項目打成的jar包放本地路徑:/com/companyname/project-group --><groupId>com.companyname.project-group</groupId><!-- 項目的唯一ID,一個groupId下面可能多個項目,就是靠artifactId來區分的 --><artifactId>project</artifactId><!-- 版本號 --><version>1.0.0</version><!--打包方式默認:jarjar指的是普通的java項目打包方式! 項目打成jar包!war指的是web項目打包方式!項目打成war包!pom不會講項目打包!這個項目作為父工程,被其他工程聚合或者繼承!后面會講解兩個概念--><packaging>jar/pom/war</packaging>
依賴管理和添加:
?
<!--通過編寫依賴jar包的gav必要屬性,引入第三方依賴!scope屬性是可選的,可以指定依賴生效范圍!依賴信息查詢方式:1. maven倉庫信息官網 https://mvnrepository.com/2. maven search插件搜索--><dependencies><!-- 引入具體的依賴包 --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version><!--生效范圍- compile :main目錄 test目錄? ?打包打包 [默認]- provided:main目錄 test目錄? Servlet- runtime: 打包運行?????????? ?????????MySQL- test:?? ?????????test目錄????????? ????????????junit--><scope>runtime</scope></dependency></dependencies>?
依賴版本提取和維護:
<!--聲明版本--><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><!--命名隨便,內部制定版本號即可!--><junit.version>4.11</junit.version><!-- 也可以通過 maven規定的固定的key,配置maven的參數!如下配置編碼格式!--><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><!--引用properties聲明版本 --><version>${junit.version}</version></dependency></dependencies>
六、依賴傳遞和依賴沖突(不用管,就是一種原理說明,總之用maven導入總是對的)
依賴傳遞指的是當一個模塊或庫 A 依賴于另一個模塊或庫 B,而 B 又依賴于模塊或庫 C,那么 A 會間接依賴于 C。這種依賴傳遞結構可以形成一個依賴樹。
當我們引入一個庫或框架時,構建工具(如 Maven、Gradle)會自動解析和加載其所有的直接和間接依賴,確保這些依賴都可用。
依賴傳遞的作用是:
1. 減少重復依賴:當多個項目依賴同一個庫時,Maven 可以自動下載并且只下載一次該庫。這樣可以減少項目的構建時間和磁盤空間。
2. 自動管理依賴: Maven 可以自動管理依賴項,使用依賴傳遞,簡化了依賴項的管理,使項目構建更加可靠和一致。
3. 確保依賴版本正確性:通過依賴傳遞的依賴,之間都不會存在版本兼容性問題,確實依賴的版本正確性!
當直接引用或者間接引用出現了相同的jar包! 這時呢,一個項目就會出現相同的重復jar包,這就算作沖突!依賴沖突避免出現重復依賴,并且終止依賴傳遞!
maven自動解決依賴沖突問題能力,會按照自己的原則,進行重復依賴選擇。同時也提供了手動解決的沖突的方式,不過不推薦!
解決依賴沖突(如何選擇重復依賴)方式:
?1. 自動選擇原則
????? - 短路優先原則(第一原則)
????????? A—>B—>C—>D—>E—>X(version 0.0.1)
? ? ? ? ? A—>F—>X(version 0.0.2)
?????????則A依賴于X(version 0.0.2)。
?????- 依賴路徑長度相同情況下,則“先聲明優先”(第二原則)
????????? A—>E—>X(version 0.0.1)
????????? A—>F—>X(version 0.0.2)
????????? 在<depencies></depencies>中,先聲明的,路徑相同,會優先選擇!
七、依賴導入失敗場景和解決方案
在使用 Maven 構建項目時,可能會發生依賴項下載錯誤的情況,主要原因有以下幾種:
1. 下載依賴時出現網絡故障或倉庫服務器宕機等原因,導致無法連接至 Maven 倉庫,從而無法下載依賴。
2.? 依賴項的版本號或配置文件中的版本號錯誤,或者依賴項沒有正確定義,導致 Maven 下載的依賴項與實際需要的不一致,從而引發錯誤。
3.? 本地 Maven 倉庫或緩存被污染或損壞,導致 Maven 無法正確地使用現有的依賴項,并且也無法重新下載!
解決方案:
1. 檢查網絡連接和 Maven 倉庫服務器狀態。
2. 確保依賴項的版本號與項目對應的版本號匹配,并檢查 POM 文件中的依賴項是否正確。
3. 清除本地 Maven 倉庫緩存(lastUpdated 文件),因為只要存在 lastupdated 緩存文件,刷新也不會重新下載。本地倉庫中,根據依賴的 gav 屬性依次向下查找文件夾,最終刪除內部的文件,刷新重新下載即可!
例如: pom.xml依賴
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency>
??? 文件:
??? 腳本使用:
八、構建概念
項目構建是指將源代碼、依賴庫和資源文件等轉換成可執行或可部署的應用程序的過程,在這個過程中包括編譯源代碼、鏈接依賴庫、打包和部署等多個步驟。
主動觸發場景:
- 重新編譯 : 編譯不充分, 部分文件沒有被編譯!
- 打包 : 獨立部署到外部服務器軟件,打包部署
- 部署本地或者私服倉庫 : maven工程加入到本地或者私服倉庫,供其他工程使用
命令方式構建:
語法: mvn 構建命令? 構建命令....
可視化方式構建:
構建命令周期:
構建生命周期可以理解成是一組固定構建命令的有序集合,觸發周期后的命令,會自動觸發周期前的命令!也是一種簡化構建的思路!
- 清理周期:主要是對項目編譯生成文件進行清理
??? 包含命令:clean
- 默認周期:定義了真正構件時所需要執行的所有步驟,它是生命周期中最核心的部分
??? 包含命令:compile - test - package - install / deploy
- 報告周期
??? 包含命令:site
??? 打包: mvn clean package
?? 本地倉庫: mvn clean install
最佳使用方案:
打包: mvn clean package
重新編譯: mvn clean compile
本地部署: mvn clean install
周期,命令和插件:
周期→包含若干命令→包含若干插件!
使用周期命令構建,簡化構建過程!
最終進行構建的是插件!
插件配置(解決war包版本和JDK版本不兼容的問題):
<build>
?? <!-- jdk17 和 war包版本插件不匹配 -->
??? <plugins>
??????? <plugin>
??????????? <groupId>org.apache.maven.plugins</groupId>
??????????? <artifactId>maven-war-plugin</artifactId>
??????????? <version>3.2.2</version>
??????? </plugin>
??? </plugins>
</build>
九、繼承與聚合
Maven 繼承是指在 Maven 的項目中,讓一個項目從另一個項目中繼承配置信息的機制。繼承可以讓我們在多個項目中共享同一配置信息,簡化項目的管理和維護工作。
繼承作用:
作用:在父工程中統一管理項目中的依賴信息,進行統一版本管理!
它的背景是:
對一個比較大型的項目進行了模塊拆分。
一個 project 下面,創建了很多個 module。
每一個 module 都需要配置自己的依賴信息。
它背后的需求是:
多個模塊要使用同一個框架,它們應該是同一個版本,所以整個項目中使用的框架版本需要統一管理。
使用框架時所需要的 jar 包組合(或者說依賴信息組合)需要經過長期摸索和反復調試,最終確定一個可用組合。這個耗費很大精力總結出來的方案不應該在新的項目中重新摸索。
通過在父工程中為整個項目維護依賴信息的組合既保證了整個項目使用規范、準確的 jar 包;又能夠將以往的經驗沉淀下來,節約時間和精力。
1、繼承語法
父工程:
<groupId>com.atguigu.maven</groupId><artifactId>pro03-maven-parent</artifactId><version>1.0-SNAPSHOT</version><!-- 當前工程作為父工程,它要去管理子工程,所以打包方式必須是 pom --><packaging>pom</packaging>
子工程:
<!-- 使用parent標簽指定當前工程的父工程 --><parent><!-- 父工程的坐標 --><groupId>com.atguigu.maven</groupId><artifactId>pro03-maven-parent</artifactId><version>1.0-SNAPSHOT</version></parent><!-- 子工程的坐標 --><!-- 如果子工程坐標中的groupId和version與父工程一致,那么可以省略 --><!-- <groupId>com.atguigu.maven</groupId> --><artifactId>pro04-maven-module</artifactId><!-- <version>1.0-SNAPSHOT</version> -->
2、父工程依賴統一管理
父工程聲明版本:
<!-- 使用dependencyManagement標簽配置對依賴的管理 --><!-- 被管理的依賴并沒有真正被引入到工程 --><dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.0.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>4.0.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.0.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>4.0.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>4.0.0.RELEASE</version></dependency></dependencies></dependencyManagement>
子工程引用版本
<!-- 子工程引用父工程中的依賴信息時,可以把版本號去掉。? --><!-- 把版本號去掉就表示子工程中這個依賴的版本由父工程決定。 --><!-- 具體來說是由父工程的dependencyManagement來決定。 --><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId></dependency></dependencies>
3、聚合概念
Maven 聚合是指將多個項目組織到一個父級項目中,通過觸發父工程的構建,統一按順序觸發子工程構建的過程!!
4、聚合作用
1)統一管理子項目構建:通過聚合,可以將多個子項目組織在一起,方便管理和維護。
2)優化構建順序:通過聚合,可以對多個項目進行順序控制,避免出現構建依賴混亂導致構建失敗的情況。
5、聚合語法
父項目中包含的子項目列表。
<project><groupId>com.example</groupId><artifactId>parent-project</artifactId><packaging>pom</packaging><version>1.0.0</version><modules><module>child-project1</module><module>child-project2</module></modules></project>
6、聚合演示
通過觸發父工程構建命令、引發所有子模塊構建!產生反應堆!
十、總結
核心點
掌握目標
安裝
maven安裝、環境變量、maven配置文件修改
工程創建
gavp屬性理解、JavaSE/EE工程創建、項目結構
依賴管理
依賴添加、依賴傳遞、版本提取、導入依賴錯誤解決
構建管理
構建過程、構建場景、構建周期等
繼承和聚合
理解繼承和聚合作用、繼承語法和實踐、聚合語法和實踐
以上,maven學習筆記總結
祝好。