java maven進(jìn)階教學(xué)
1 Maven依賴范圍
1.1 依賴配置
<project> ... <dependencies> <denpendcy> <groupId></groupId> <artifactId></artifactId> <version></version> <type></type> <scope></scope> <optional></optional> <exclusions> <exclusion> ... </exclusion> </exclusions> </denpendcy> </dependencies> </project>
在pom.xml文件中,根元素project下的dependencies標(biāo)簽中可以包含一個(gè)或者多個(gè)dependency元素,以聲明一個(gè)或者多個(gè)項(xiàng)目依賴。每個(gè)依賴dependency標(biāo)簽中都應(yīng)該包含以下元素。
groupId
: 依賴組id,可以理解為java的包名,一般用域名倒寫
artifactId
: 可以理解為項(xiàng)目名或者依賴名
version
:依賴的版本
type
:依賴的類型,對應(yīng)項(xiàng)目坐標(biāo)定義的packaging,大部分情況下,該屬性不必聲明,其默認(rèn)值為jar
scope
:依賴的范圍,這個(gè)對應(yīng)的屬性就比較多了,后續(xù)會(huì)做詳細(xì)介紹
optional
:標(biāo)記依賴是否可選
exclusions
:用來排除依賴的傳遞性,其中可以配置多個(gè)exclusion屬性,每個(gè)標(biāo)簽對應(yīng)著groupId、artifactId、version等三個(gè)基本屬性
很多時(shí)候,大部分依賴聲明只包含groupId、artifactId和version這三個(gè)指定基本坐標(biāo)的元素;而在一些特殊情況下,其它元素至關(guān)重要,也就是上面提到的scope、optional和exclusions。
1.2 依賴范圍概念
maven在編譯項(xiàng)目主代碼的時(shí)候需要使用一套classpath。舉例來說:
所以,依賴范圍就是用來控制依賴與這三種classpath(編譯classpath、測試classpath、運(yùn)行classpath)的關(guān)系的。
依賴具體范圍:scope(依賴范圍)共有五種,它們分別是compile、provided、runtime、test、system。
2 pom依賴傳遞性
在maven中,依賴傳遞是可以傳遞的,假設(shè)存在三個(gè)項(xiàng)目,分別是項(xiàng)目A,項(xiàng)目B,項(xiàng)目C。假設(shè)C依賴B,B依賴A,那么根據(jù)maven項(xiàng)目依賴的特征不難推出項(xiàng)目C也依賴于項(xiàng)目A.通過上圖也可以看出,在項(xiàng)目中直接依賴了spring-webmvc,而spring-webmvc依賴了Spring-aop,spring-beans等,也就是在項(xiàng)目中有依賴了spring-aop和spring-beans等等
3 依賴沖突解決
在實(shí)際的 Maven 項(xiàng)目開發(fā)中,由于項(xiàng)目引入的依賴過多,遇到 jar 沖突算是一個(gè)很常見的問題了
·標(biāo)注一:Maven Project,Maven 項(xiàng)目選項(xiàng);
·標(biāo)注二:Dependencies,項(xiàng)目依賴;
·標(biāo)注三:Show Dependencies,展示項(xiàng)目依賴圖
點(diǎn)擊Show Dependencies 按鈕之后,接下來就會(huì)出現(xiàn)以下內(nèi)容。
在我們發(fā)現(xiàn)jar包沖突之后,就可以通過exclusion進(jìn)行沖突的解決
4 分模塊構(gòu)建項(xiàng)目
Maven多模塊項(xiàng)目,適用于一些比較大的項(xiàng)目,通過合理的模塊拆分,實(shí)現(xiàn)代碼的復(fù)用,便于維護(hù)和管理。尤其是一些開源框架,也是采用多模塊的方式,提供插件集成,用戶可以根據(jù)需要配置指定的模塊
4.1 創(chuàng)建一個(gè)父maven工程
1. 新建一個(gè)maven項(xiàng)目,選擇存儲位置,并選擇創(chuàng)建一個(gè)簡單的maven工程
2.創(chuàng)建第一個(gè)模塊
3.創(chuàng)建第二個(gè)模塊
4.選擇繼承的父模塊
5.創(chuàng)建聚合工程C
這種項(xiàng)目結(jié)構(gòu)主要應(yīng)用在大型項(xiàng)目中,多人協(xié)作開發(fā),小型項(xiàng)目 或 人員配置不足情況下不建議使用; 之前因?yàn)橐恢睕]有機(jī)會(huì)參與大型項(xiàng)目開發(fā),或是這種分布式項(xiàng)目的搭建,網(wǎng)上也沒有這方面系統(tǒng)全面的說明 ,可能真正用到這種架構(gòu)的不需要自己動(dòng)手去弄,等著別人搭好進(jìn)去碼代碼就可以了
5 聚合和繼承
Maven的聚合特性可以幫助我們把項(xiàng)目的多個(gè)模塊聚合在一起,使用一條命令進(jìn)行構(gòu)建,即一條命令實(shí)現(xiàn)構(gòu)建多個(gè)項(xiàng)目;
Maven的繼承特性可以將各個(gè)模塊相同的依賴和插件配置提取出來,在簡化POM的同時(shí)還可以促進(jìn)各個(gè)模塊配置的一致性
5.1 聚合
<modules> <module>spring1</module> <module>spring2</module> <module>spring3</module> </modules>
在前面的學(xué)習(xí)中,我們見過打包方式為jar和war的,但是聚合模塊的打包方式必須為pom,否則無法完成構(gòu)建。
5.2 繼承
<parent> <groupId>com.baidu</groupId> <artifactId>miliao-rootpom</artifactId> <version>2.0.3</version> </parent>
可繼承的POM元素如下:
- groupId:項(xiàng)目組ID,項(xiàng)目坐標(biāo)的核心元素
- version:項(xiàng)目版本,項(xiàng)目坐標(biāo)的核心因素
- distributionManagement:項(xiàng)目的部署配置
- dependencies:項(xiàng)目的依賴配置
- dependencyManagement:項(xiàng)目的依賴管理配置
5.3 聚合和繼承的關(guān)系
雖然聚合模塊和父模塊經(jīng)常合二為一,但是聚合和繼承是兩個(gè)不同的概念,其實(shí)是沒有什么關(guān)系的。
聚合模塊知道它聚合了哪些模塊,但是被聚合的模塊不知道聚合模塊的存在;
繼承父模塊不知道子模塊的存在,但是子模塊都必須知道自己的父模塊是誰。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
springboot集成ES實(shí)現(xiàn)磁盤文件全文檢索的示例代碼
這篇文章主要介紹了springboot集成ES實(shí)現(xiàn)磁盤文件全文檢索的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11SpringBoot整合Java DL4J實(shí)現(xiàn)文本分類系統(tǒng)
在當(dāng)今信息爆炸的時(shí)代,自然語言處理領(lǐng)域中的文本分類顯得尤為重要,文本分類能夠高效地組織和管理海量的文本數(shù)據(jù),隨著互聯(lián)網(wǎng)的飛速發(fā)展,我們每天都被大量的文本信息所包圍,本文將介紹如何使用 Spring Boot 整合 Java Deeplearning4j 來構(gòu)建一個(gè)文本分類系統(tǒng)2024-10-10一文總結(jié)RabbitMQ中的消息確認(rèn)機(jī)制
RabbitMQ消息確認(rèn)機(jī)制指的是在消息傳遞過程中,發(fā)送方發(fā)送消息后,接收方需要對消息進(jìn)行確認(rèn),以確保消息被正確地接收和處理,本文為大家整理了RabbitMQ中的消息確認(rèn)機(jī)制,需要的可以參考一下2023-06-06Java發(fā)送http請求的示例(get與post方法請求)
這篇文章主要介紹了Java發(fā)送http請求的示例(get與post方法請求),幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2021-01-01Spring實(shí)戰(zhàn)之Bean的作用域singleton和prototype用法分析
這篇文章主要介紹了Spring實(shí)戰(zhàn)之Bean的作用域singleton和prototype用法,結(jié)合實(shí)例形式分析了Bean的作用域singleton和prototype相關(guān)使用方法及操作注意事項(xiàng),需要的朋友可以參考下2019-11-11Java異步調(diào)用轉(zhuǎn)同步方法實(shí)例詳解
這篇文章主要介紹了Java異步調(diào)用轉(zhuǎn)同步方法實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Java中Set與List的關(guān)系與區(qū)別介紹
這篇文章主要介紹了Java中Set與List的關(guān)系與區(qū)別介紹,本文總結(jié)它們兩個(gè)接口都是繼承自Collection、它們之間的存儲方式不一樣,需要的朋友可以參考下2015-03-03Java編程實(shí)現(xiàn)暴力破解WIFI密碼的方法分析
這篇文章主要介紹了Java編程實(shí)現(xiàn)暴力破解WIFI密碼的方法,結(jié)合具體實(shí)例形式分析了java暴力破解WiFi密碼的原理、操作步驟、實(shí)現(xiàn)技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2018-12-12