杭州網(wǎng)站制作報(bào)價(jià)培訓(xùn)機(jī)構(gòu)招生方案模板
1. 基于IDEA 進(jìn)行Maven依賴(lài)管理
1.1 依賴(lài)管理概念
Maven 依賴(lài)管理是 Maven 軟件中最重要的功能之一。Maven 的依賴(lài)管理能夠幫助開(kāi)發(fā)人員自動(dòng)解決軟件包依賴(lài)問(wèn)題,使得開(kāi)發(fā)人員能夠輕松地將其他開(kāi)發(fā)人員開(kāi)發(fā)的模塊或第三方框架集成到自己的應(yīng)用程序或模塊中,避免出現(xiàn)版本沖突和依賴(lài)缺失等問(wèn)題。
我們通過(guò)定義 POM 文件,Maven 能夠自動(dòng)解析項(xiàng)目的依賴(lài)關(guān)系,并通過(guò) Maven 倉(cāng)庫(kù)自動(dòng)下載和管理依賴(lài),從而避免了手動(dòng)下載和管理依賴(lài)的繁瑣工作和可能引發(fā)的版本沖突問(wèn)題。
總之,Maven 的依賴(lài)管理是 Maven 軟件的一個(gè)核心功能之一,使得軟件包依賴(lài)的管理和使用更加智能和方便,簡(jiǎn)化了開(kāi)發(fā)過(guò)程中的工作,并提高了軟件質(zhì)量和可維護(hù)性。
1.2 Maven工程核心信息配置和解讀(GAVP)
位置:pom.xml
<!-- 模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 公司或者組織的唯一標(biāo)志,并且配置時(shí)生成的路徑也是由此生成, 如com.companyname.project-group,maven會(huì)將該項(xiàng)目打成的jar包放本地路徑:/com/companyname/project-group -->
<groupId>com.companyname.project-group</groupId>
<!-- 項(xiàng)目的唯一ID,一個(gè)groupId下面可能多個(gè)項(xiàng)目,就是靠artifactId來(lái)區(qū)分的 -->
<artifactId>project</artifactId>
<!-- 版本號(hào) -->
<version>1.0.0</version><!--打包方式默認(rèn):jarjar指的是普通的java項(xiàng)目打包方式! 項(xiàng)目打成jar包!war指的是web項(xiàng)目打包方式!項(xiàng)目打成war包!pom不會(huì)講項(xiàng)目打包!這個(gè)項(xiàng)目作為父工程,被其他工程聚合或者繼承!后面會(huì)講解兩個(gè)概念
-->
<packaging>jar/pom/war</packaging>
1.3 Maven工程依賴(lài)管理配置
位置:pom.xml
依賴(lài)管理和依賴(lài)添加
<!-- 通過(guò)編寫(xiě)依賴(lài)jar包的gav必要屬性,引入第三方依賴(lài)!scope屬性是可選的,可以指定依賴(lài)生效范圍!依賴(lài)信息查詢(xún)方式:1. maven倉(cāng)庫(kù)信息官網(wǎng) https://mvnrepository.com/2. mavensearch插件搜索-->
<dependencies><!-- 引入具體的依賴(lài)包 --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version><!-- 依賴(lài)范圍 --><scope>runtime</scope></dependency></dependencies>
依賴(lài)版本統(tǒng)一提取和維護(hù)
<!--聲明版本-->
<properties><!--命名隨便,內(nèi)部制定版本號(hào)即可!--><junit.version>4.12</junit.version><!-- 也可以通過(guò) maven規(guī)定的固定的key,配置maven的參數(shù)!如下配置編碼格式!--><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>
1.4 依賴(lài)范圍
通過(guò)設(shè)置坐標(biāo)的依賴(lài)范圍(scope),可以設(shè)置對(duì)應(yīng)jar包的作用范圍:編譯環(huán)境、測(cè)試環(huán)境、運(yùn)行環(huán)境
依賴(lài)范圍 | 描述 |
---|---|
compile | 編譯依賴(lài)范圍,scope 元素的缺省值。使用此依賴(lài)范圍的 Maven 依賴(lài),對(duì)于三種 classpath 均有效,即該 Maven 依賴(lài)在上述三種 classpath 均會(huì)被引入。例如,log4j 在編譯、測(cè)試、運(yùn)行過(guò)程都是必須的。 |
test | 測(cè)試依賴(lài)范圍。使用此依賴(lài)范圍的 Maven 依賴(lài),只對(duì)測(cè)試 classpath 有效。例如,Junit 依賴(lài)只有在測(cè)試階段才需要。 |
provided | 已提供依賴(lài)范圍。使用此依賴(lài)范圍的 Maven 依賴(lài),只對(duì)編譯 classpath 和測(cè)試 classpath 有效。例如,servlet-api 依賴(lài)對(duì)于編譯、測(cè)試階段而言是需要的,但是運(yùn)行階段,由于外部容器已經(jīng)提供,故不需要 Maven 重復(fù)引入該依賴(lài)。 |
runtime | 運(yùn)行時(shí)依賴(lài)范圍。使用此依賴(lài)范圍的 Maven 依賴(lài),只對(duì)測(cè)試 classpath、運(yùn)行 classpath 有效。例如,JDBC 驅(qū)動(dòng)實(shí)現(xiàn)依賴(lài),其在編譯時(shí)只需 JDK 提供的 JDBC 接口即可,只有測(cè)試、運(yùn)行階段才需要實(shí)現(xiàn)了 JDBC 接口的驅(qū)動(dòng)。 |
system | 系統(tǒng)依賴(lài)范圍,其效果與 provided 的依賴(lài)范圍一致。其用于添加非 Maven 倉(cāng)庫(kù)的本地依賴(lài),通過(guò)依賴(lài)元素 dependency 中的 systemPath 元素指定本地依賴(lài)的路徑。鑒于使用其會(huì)導(dǎo)致項(xiàng)目的可移植性降低,一般不推薦使用。 |
import | 導(dǎo)入依賴(lài)范圍,該依賴(lài)范圍只能與 dependencyManagement 元素配合使用,其功能是將目標(biāo) pom.xml 文件中 dependencyManagement 的配置導(dǎo)入合并到當(dāng)前 pom.xml 的 dependencyManagement 中。 |
主要的三種依賴(lài)范圍為complie、test、provided。
2. ## Maven依賴(lài)傳遞和依賴(lài)沖突
2.1 Maven依賴(lài)傳遞特性
概念
假如有Maven項(xiàng)目A,項(xiàng)目B依賴(lài)A,項(xiàng)目C依賴(lài)B。那么我們可以說(shuō) C依賴(lài)A。也就是說(shuō),依賴(lài)的關(guān)系為:C—>B—>A, 那么我們執(zhí)行項(xiàng)目C時(shí),會(huì)自動(dòng)把B、A都下載導(dǎo)入到C項(xiàng)目的jar包文件夾中,這就是依賴(lài)的傳遞性。
作用
- 簡(jiǎn)化依賴(lài)導(dǎo)入過(guò)程
- 確保依賴(lài)版本正確
傳遞的原則
在 A 依賴(lài) B,B 依賴(lài) C 的前提下,C 是否能夠傳遞到 A,取決于 B 依賴(lài) C 時(shí)使用的依賴(lài)范圍以及配置
-
B 依賴(lài) C 時(shí)使用 compile 范圍:可以傳遞
-
B 依賴(lài) C 時(shí)使用 test 或 provided 范圍:不能傳遞,所以需要這樣的 jar 包時(shí),就必須在需要的地方明確配置依賴(lài)才可以。
-
B 依賴(lài) C 時(shí),若配置了以下標(biāo)簽,則不能傳遞
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.15</version><optional>true</optional> </dependency>
依賴(lài)傳遞終止
- 非compile范圍進(jìn)行依賴(lài)傳遞
- 使用optional配置終止傳遞
- 依賴(lài)沖突(傳遞的依賴(lài)已經(jīng)存在)
2.2 Maven依賴(lài)沖突特性
當(dāng)直接引用或者間接引用出現(xiàn)了相同的jar包! 這時(shí)呢,一個(gè)項(xiàng)目就會(huì)出現(xiàn)相同的重復(fù)jar包,這就算作沖突!依賴(lài)沖突避免出現(xiàn)重復(fù)依賴(lài),并且終止依賴(lài)傳遞!
maven自動(dòng)解決依賴(lài)沖突問(wèn)題能力,會(huì)按照自己的原則,進(jìn)行重復(fù)依賴(lài)選擇。同時(shí)也提供了手動(dòng)解決的沖突的方式,不過(guò)不推薦!
解決依賴(lài)沖突(如何選擇重復(fù)依賴(lài))方式:
-
自動(dòng)選擇原則
-
短路優(yōu)先原則(第一原則)
A—>B—>C—>D—>E—>X(version 0.0.1)
A—>F—>X(version 0.0.2)
則A依賴(lài)于X(version 0.0.2)。
-
依賴(lài)路徑長(zhǎng)度相同情況下,則“先聲明優(yōu)先”(第二原則)
A—>E—>X(version 0.0.1)
A—>F—>X(version 0.0.2)
在<depencies></depencies>中,先聲明的,路徑相同,會(huì)優(yōu)先選擇!
-
-
手動(dòng)排除
<dependency><groupId>org.kkk.maven</groupId><artifactId>maven-java</artifactId><version>1.0-SNAPSHOT</version><scope>compile</scope><!-- 使用excludes標(biāo)簽配置依賴(lài)的排除 --><exclusions><!-- 在exclude標(biāo)簽中配置一個(gè)具體的排除 --><exclusion><!-- 指定要排除的依賴(lài)的坐標(biāo)(不需要寫(xiě)version) --><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions> </dependency>
3. Maven工程繼承和聚合
3.1 Maven工程繼承
-
繼承概念
Maven 繼承是指在 Maven 的項(xiàng)目中,讓一個(gè)項(xiàng)目從另一個(gè)項(xiàng)目中繼承配置信息的機(jī)制。繼承可以讓我們?cè)诙鄠€(gè)項(xiàng)目中共享同一配置信息,簡(jiǎn)化項(xiàng)目的管理和維護(hù)工作。
-
繼承作用
在父工程中統(tǒng)一管理項(xiàng)目中的依賴(lài)信息。
它的背景是:
- 對(duì)一個(gè)比較大型的項(xiàng)目進(jìn)行了模塊拆分。
- 一個(gè) project 下面,創(chuàng)建了很多個(gè) module。
- 每一個(gè) module 都需要配置自己的依賴(lài)信息。
它背后的需求是:
- 在每一個(gè) module 中各自維護(hù)各自的依賴(lài)信息很容易發(fā)生出入,不易統(tǒng)一管理。
- 使用同一個(gè)框架內(nèi)的不同 jar 包,它們應(yīng)該是同一個(gè)版本,所以整個(gè)項(xiàng)目中使用的框架版本需要統(tǒng)一。
- 使用框架時(shí)所需要的 jar 包組合(或者說(shuō)依賴(lài)信息組合)需要經(jīng)過(guò)長(zhǎng)期摸索和反復(fù)調(diào)試,最終確定一個(gè)可用組合。這個(gè)耗費(fèi)很大精力總結(jié)出來(lái)的方案不應(yīng)該在新的項(xiàng)目中重新摸索。
- 通過(guò)在父工程中為整個(gè)項(xiàng)目維護(hù)依賴(lài)信息的組合既保證了整個(gè)項(xiàng)目使用規(guī)范、準(zhǔn)確的 jar 包;又能夠?qū)⒁酝慕?jīng)驗(yàn)沉淀下來(lái),節(jié)約時(shí)間和精力。
-
繼承語(yǔ)法
-
父工程
<groupId>org.kkk.maven</groupId><artifactId>maven-parent</artifactId><version>1.0-SNAPSHOT</version><!-- 當(dāng)前工程作為父工程,它要去管理子工程,所以打包方式必須是 pom --><packaging>pom</packaging>
-
子工程
<!-- 使用parent標(biāo)簽指定當(dāng)前工程的父工程 --> <parent><!-- 父工程的坐標(biāo) --><groupId>org.kkk.maven</groupId><artifactId>maven-parent</artifactId><version>1.0-SNAPSHOT</version> </parent><!-- 子工程的坐標(biāo) --> <!-- 如果子工程坐標(biāo)中的groupId和version與父工程一致,那么可以省略 --> <!-- <groupId>org.kkk.maven</groupId> --> <artifactId>maven-module</artifactId> <!-- <version>1.0-SNAPSHOT</version> -->
-
-
父工程依賴(lài)統(tǒng)一管理
-
父工程聲明版本
<!-- 使用dependencyManagement標(biāo)簽配置對(duì)依賴(lài)的管理 --> <!-- 被管理的依賴(lài)并沒(méi)有真正被引入到工程 --> <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>
-
子工程引用版本
<!-- 子工程引用父工程中的依賴(lài)信息時(shí),可以把版本號(hào)去掉。 --> <!-- 把版本號(hào)去掉就表示子工程中這個(gè)依賴(lài)的版本由父工程決定。 --> <!-- 具體來(lái)說(shuō)是由父工程的dependencyManagement來(lái)決定。 --> <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.2 Maven工程聚合
-
聚合概念
Maven 聚合是指將多個(gè)項(xiàng)目組織到一個(gè)父級(jí)項(xiàng)目中,以便一起構(gòu)建和管理的機(jī)制。聚合可以幫助我們更好地管理一組相關(guān)的子項(xiàng)目,同時(shí)簡(jiǎn)化它們的構(gòu)建和部署過(guò)程。簡(jiǎn)單地講,將多個(gè)項(xiàng)目聚合到一個(gè)父級(jí)項(xiàng)目中,那么可以通過(guò)對(duì)父級(jí)項(xiàng)目進(jìn)行構(gòu)建達(dá)到同時(shí)構(gòu)建多個(gè)子項(xiàng)目的效果。
-
聚合作用
- 管理多個(gè)子項(xiàng)目:通過(guò)聚合,可以將多個(gè)子項(xiàng)目組織在一起,方便管理和維護(hù)。
- 構(gòu)建和發(fā)布一組相關(guān)的項(xiàng)目:通過(guò)聚合,可以在一個(gè)命令中構(gòu)建和發(fā)布多個(gè)相關(guān)的項(xiàng)目,簡(jiǎn)化了部署和維護(hù)工作。
- 優(yōu)化構(gòu)建順序:通過(guò)聚合,可以對(duì)多個(gè)項(xiàng)目進(jìn)行順序控制,避免出現(xiàn)構(gòu)建依賴(lài)混亂導(dǎo)致構(gòu)建失敗的情況。
- 統(tǒng)一管理依賴(lài)項(xiàng):通過(guò)聚合,可以在父項(xiàng)目中管理公共依賴(lài)項(xiàng)和插件,避免重復(fù)定義。
-
聚合語(yǔ)法
父項(xiàng)目中包含的子項(xiàng)目列表。在父項(xiàng)目的modules模塊中引入子項(xiàng)目的信息。
<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>