文章目錄
- 一、基于IDEA 進行Maven依賴管理
- 1. 依賴管理概念
- 2. Maven工程核心信息配置和解讀(GAVP)
- 3. Maven工程依賴管理配置
- 依賴管理和依賴添加
- 依賴版本統一提取和維護
- 4. 依賴范圍
- 5. Maven工程依賴下載失敗錯誤解決
- 6. Maven工程Build構建配置
- 指定打包命名
- 指定打包文件
- 配置依賴插件
- 二、Maven依賴傳遞和依賴沖突
- 1. Maven依賴傳遞特性
- 2. Maven依賴沖突特性
- 三、Maven工程繼承和聚合關系
- 1. 繼承關系
- 繼承概念
- 繼承作用
- 繼承語法
- 2. 聚合關系
- 聚合概念:
- 聚合作用
一、基于IDEA 進行Maven依賴管理
1. 依賴管理概念
Maven 的依賴管理是 Maven 軟件的一個核心功能之一,能夠幫助開發人員自動解決軟件包依賴問題,簡化了開發過程中的工作,避免出現版本沖突和依賴缺失等問題。
通過定義 POM 文件,Maven 能夠自動解析項目的依賴關系,并通過 Maven 倉庫自動下載和管理依賴,從而避免了手動下載和管理依賴的繁瑣工作和可能引發的版本沖突問題。
2. Maven工程核心信息配置和解讀(GAVP)
<!-- 模型版本 -->
<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>
3. Maven工程依賴管理配置
依賴管理和依賴添加
<!-- 通過編寫依賴jar包的gav必要屬性,引入第三方依賴!scope屬性是可選的,可以指定依賴生效范圍!依賴信息查詢方式:1. maven倉庫信息官網 https://mvnrepository.com/2. mavensearch插件搜索-->
<dependencies><!-- 引入具體的依賴包 --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version><!-- 依賴范圍 --><scope>runtime</scope></dependency></dependencies>
依賴版本統一提取和維護
<!--聲明版本-->
<properties><!--命名隨便,內部制定版本號即可!--><junit.version>4.12</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>
4. 依賴范圍
通過設置坐標的依賴范圍(scope),可以設置 對應jar包的作用范圍:編譯環境、測試環境、運行環境
依賴范圍 | 描述 |
---|---|
compile | 編譯依賴范圍,scope 元素的缺省值。使用此依賴范圍的 Maven 依賴,對于三種 classpath 均有效,即該 Maven 依賴在上述三種 classpath 均會被引入。例如,log4j 在編譯、測試、運行過程都是必須的。 |
test | 測試依賴范圍。使用此依賴范圍的 Maven 依賴,只對測試 classpath 有效。例如,Junit 依賴只有在測試階段才需要。 |
provided | 已提供依賴范圍。使用此依賴范圍的 Maven 依賴,只對編譯 classpath 和測試 classpath 有效。例如,servlet-api 依賴對于編譯、測試階段而言是需要的,但是運行階段,由于外部容器已經提供,故不需要 Maven 重復引入該依賴。 |
runtime | 運行時依賴范圍。使用此依賴范圍的 Maven 依賴,只對測試 classpath、運行 classpath 有效。例如,JDBC 驅動實現依賴,其在編譯時只需 JDK 提供的 JDBC 接口即可,只有測試、運行階段才需要實現了 JDBC 接口的驅動。 |
system | 系統依賴范圍,其效果與 provided 的依賴范圍一致。其用于添加非 Maven 倉庫的本地依賴,通過依賴元素 dependency 中的 systemPath 元素指定本地依賴的路徑。鑒于使用其會導致項目的可移植性降低,一般不推薦使用。 |
import | 導入依賴范圍,該依賴范圍只能與 dependencyManagement 元素配合使用,其功能是將目標 pom.xml 文件中 dependencyManagement 的配置導入合并到當前 pom.xml 的 dependencyManagement 中。 |
5. Maven工程依賴下載失敗錯誤解決
在使用 Maven 構建項目時,可能會發生依賴項下載錯誤的情況,解決方案:
-
檢查網絡連接和 Maven 倉庫服務器狀態。
-
確保依賴項的版本號與項目對應的版本號匹配,并檢查 POM 文件中的依賴項是否正確。
-
清除本地 Maven 倉庫緩存(lastUpdated 文件),因為只要存在lastupdated緩存文件,刷新也不會重新下載。本地倉庫中,根據依賴的gav屬性依次向下查找文件夾,最終刪除內部的文件,刷新重新下載即可!
例如: pom.xml依賴
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version> </dependency>
或者可以將清除lastUpdated文件的操作寫在一個腳本文件中,手動創建文件"clearLastUpdated.bat",名字任意,但是后綴必須是bat,將以下內容復制到文件中
cls
@ECHO OFF
SET CLEAR_PATH=D:
SET CLEAR_DIR=D:\maven-repository(本地倉庫路徑)
color 0a
TITLE ClearLastUpdated For Windows
GOTO MENU
:MENU
CLS
ECHO.
ECHO. * * * * ClearLastUpdated For Windows * * * *
ECHO. * *
ECHO. * 1 清理*.lastUpdated *
ECHO. * *
ECHO. * 2 查看*.lastUpdated *
ECHO. * *
ECHO. * 3 退 出 *
ECHO. * *
ECHO. * * * * * * * * * * * * * * * * * * * * * * * *
ECHO.
ECHO.請輸入選擇項目的序號:
set /p ID=
IF "%id%"=="1" GOTO cmd1
IF "%id%"=="2" GOTO cmd2
IF "%id%"=="3" EXIT
PAUSE
:cmd1
ECHO. 開始清理
%CLEAR_PATH%
cd %CLEAR_DIR%
for /r %%i in (*.lastUpdated) do del %%i
ECHO.OK
PAUSE
GOTO MENU
:cmd2
ECHO. 查看*.lastUpdated文件
%CLEAR_PATH%
cd %CLEAR_DIR%
for /r %%i in (*.lastUpdated) do echo %%i
ECHO.OK
PAUSE
GOTO MENU
6. Maven工程Build構建配置
項目構建是指將源代碼、依賴庫和資源文件等轉換成可執行或可部署的應用程序的過程,包括編譯源代碼、鏈接依賴庫、打包和部署等多個步驟。
我們可以在pom.xml定制一些配置,來修改默認構建【在pom.xml / build標簽中指定】的行為和產物!
指定打包命名
<!-- 默認的打包名稱:artifactid+verson.打包方式 -->
<build><finalName>定義打包名稱</finalName>
</build>
指定打包文件
- 在java文件夾中添加java類,會自動打包編譯到classes文件夾下
- 在java文件夾中添加xml文件,默認不會被打包
- 默認情況下,按照maven工程結構放置的文件會默認被編譯和打包
除此之外、我們可以使用resources標簽,指定要打包資源的文件夾要把哪些靜態資源打包到 classes根目錄下!
例如:不被打包
<build><!--設置要打包的資源位置--><resources><resource><!--設置資源所在目錄--><directory>src/main/java</directory><includes><!--設置包含的資源類型--><include>**/*.xml</include></includes></resource></resources>
</build>
配置依賴插件
dependencies標簽下引入開發需要的jar包!我們可以在build/plugins/plugin標簽引入插件!
常用的插件:修改jdk版本、tomcat插件、mybatis分頁插件、mybatis逆向工程插件等等!
<build><plugins><!-- java編譯插件,配jdk的編譯版本 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><!-- tomcat插件 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>8090</port><path>/</path><uriEncoding>UTF-8</uriEncoding><server>tomcat7</server></configuration></plugin></plugins>
</build>
二、Maven依賴傳遞和依賴沖突
1. Maven依賴傳遞特性
概念
假如有Maven項目A,項目B依賴A,項目C依賴B。那么我們可以說 C依賴A。也就是說,依賴的關系為:C—>B—>A, 那么我們執行項目C時,會自動把B、A都下載導入到C項目的jar包文件夾中,這就是依賴的傳遞性。
作用
- 簡化依賴導入過程
- 確保依賴版本正確
傳遞的原則
在 A 依賴 B,B 依賴 C 的前提下,C 是否能夠傳遞到 A,取決于 B 依賴 C 時使用的依賴范圍以及配置
-
B 依賴 C 時使用 compile 范圍:可以傳遞
-
B 依賴 C 時使用 test 或 provided 范圍:不能傳遞,所以需要這樣的 jar 包時,就必須在需要的地方明確配置依賴才可以。
-
B 依賴 C 時,若配置了以下標簽,則不能傳遞
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.15</version><optional>true</optional> </dependency>
依賴傳遞終止
- 非compile范圍進行依賴傳遞
- 使用optional配置終止傳遞
- 依賴沖突(傳遞的依賴已經存在)
2. Maven依賴沖突特性
當直接引用或者間接引用出現了相同的jar包! 這時呢,一個項目就會出現相同的重復jar包,這就算作沖突!依賴沖突避免出現重復依賴,并且終止依賴傳遞!
maven自動解決依賴沖突問題能力,會按照自己的原則,進行重復依賴選擇。
解決依賴沖突(如何選擇重復依賴)方式:
- 自動選擇原則
-
短路優先原則(第一原則)
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>中,先聲明的,路徑相同,會優先選擇!
-
- 手動排除
<dependency><groupId>com.atguigu.maven</groupId><artifactId>pro01-maven-java</artifactId><version>1.0-SNAPSHOT</version><scope>compile</scope><!-- 使用excludes標簽配置依賴的排除 --><exclusions><!-- 在exclude標簽中配置一個具體的排除 --><exclusion><!-- 指定要排除的依賴的坐標(不需要寫version) --><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions> </dependency>
三、Maven工程繼承和聚合關系
1. 繼承關系
繼承概念
在 Maven 的項目中,讓一個項目從另一個項目中繼承配置信息的機制。可以讓我們在多個項目中共享同一配置信息,簡化項目的管理和維護工作。
繼承作用
繼承作用在父工程中統一管理項目中的依賴信息。
它的背景是:
- 對一個比較大型的項目進行了模塊拆分。
- 一個 project 下面,創建了很多個 module。
- 每一個 module 都需要配置自己的依賴信息。
繼承語法
父工程
<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與父工程一致,那么可以省略 -->
<artifactId>pro04-maven-module</artifactId>
父工程依賴統一管理
父工程聲明版本
<!-- 使用dependencyManagement標簽配置對依賴的管理 -->
<!-- 被管理的依賴并沒有真正被引入到工程 -->
<dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>6.0.10</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>6.0.10</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.0.10</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>6.0.10</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>6.0.10</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>
2. 聚合關系
聚合概念:
Maven 聚合是指將多個項目組織到一個父級項目中,以便一起構建和管理的機制。可以幫助我們更好地管理一組相關的子項目,同時簡化它們的構建和部署過程。
聚合作用
- 管理多個子項目:通過聚合,可以將多個子項目組織在一起,方便管理和維護。
- 構建和發布一組相關的項目:通過聚合,可以在一個命令中構建和發布多個相關的項目,簡化了部署和維護工作。
- 優化構建順序:通過聚合,可以對多個項目進行順序控制,避免出現構建依賴混亂導致構建失敗的情況。
- 統一管理依賴項:通過聚合,可以在父項目中管理公共依賴項和插件,避免重復定義。
- 聚合語法父項目中包含的子項目列表。
<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>
- 聚合演示通過觸發父工程構建命令、引發所有子模塊構建!產生反應堆!