Java Maven依賴傳遞,可選依賴,排除依賴詳解
前言
現(xiàn)在的項目一般是拆分成一個個獨立的模塊,當在其他項目中想要使用獨立出來的這些模塊,只需要在其pom.xml使用<dependency>標簽來進行jar包的引入即可。
<dependency>其實就是依賴,關(guān)于依賴管理里面都涉及哪些內(nèi)容,我們就一個個來分析下:
- 依賴傳遞
- 可選依賴
- 排除依賴
我們先來說說什么是依賴:
依賴指當前項目運行所需的jar,一個項目可以設置多個依賴。
格式為:
<!--設置當前項目所依賴的所有jar--> <dependencies> ? ?<!--設置具體的依賴--> ? ?<dependency> ? ? ? ?<!--依賴所屬群組id--> ? ? ? ?<groupId>org.springframework</groupId> ? ? ? ?<!--依賴所屬項目id--> ? ? ? ?<artifactId>spring-webmvc</artifactId> ? ? ? ?<!--依賴版本號--> ? ? ? ?<version>5.2.10.RELEASE</version> ? ?</dependency> </dependencies>
一、依賴傳遞與沖突問題
1.1 依賴下鉆
比如下面的項目的依賴中:
有一個比較大的區(qū)別就是有的依賴前面有箭頭>
,有的依賴前面沒有。
那么這個箭頭所代表的含義是什么?打開前面的箭頭,你會發(fā)現(xiàn)這個jar包下面還包含有其他的jar包
1.2 依賴具有傳遞性
說明:A代表自己的項目;B,C,D,E,F,G代表的是項目所依賴的jar包;D1和D2 E1和E2代表是相同jar包的不同版本
- (1) A依賴了B和C,B和C有分別依賴了其他jar包,所以在A項目中就可以使用上面所有jar包,這就是所說的依賴傳遞
- (2) 依賴傳遞有直接依賴和間接依賴
相對于A來說,A直接依賴B和C,間接依賴了D1,E1,G,F(xiàn),D2和E2
相對于B來說,B直接依賴了D1和E1,間接依賴了G
直接依賴和間接依賴是一個相對的概念
- (3)因為有依賴傳遞的存在,就會導致jar包在依賴的過程中出現(xiàn)沖突問題,具體什么是沖突?Maven是如何解決沖突的?
這里所說的依賴沖突是指項目依賴的某一個jar包,有多個不同的版本,因而造成類包版本沖突。
情況一: 在pom.xml中添加兩個不同版本的Junit依賴:
<dependencies> ? ?<dependency> ? ? ?<groupId>junit</groupId> ? ? ?<artifactId>junit</artifactId> ? ? ?<version>4.12</version> ? ? ?<scope>test</scope> ? ?</dependency> ? ? ?<dependency> ? ? ?<groupId>junit</groupId> ? ? ?<artifactId>junit</artifactId> ? ? ?<version>4.11</version> ? ? ?<scope>test</scope> ? ?</dependency> </dependencies>
通過對比,會發(fā)現(xiàn)一個結(jié)論
特殊優(yōu)先:當同級配置了相同資源的不同版本,后配置的覆蓋先配置的。
情況二: 路徑優(yōu)先:當依賴中出現(xiàn)相同的資源時,層級越深,優(yōu)先級越低,層級越淺,優(yōu)先級越高
- A通過B間接依賴到E1
- A通過C間接依賴到E2
- A就會間接依賴到E1和E2,Maven會按照層級來選擇,E1是2度,E2是3度,所以最終會選擇E1
情況三: 聲明優(yōu)先:當資源在相同層級被依賴時,配置順序靠前的覆蓋配置順序靠后的
- A通過B間接依賴到D1
- A通過C間接依賴到D2
- D1和D2都是兩度,這個時候就不能按照層級來選擇,需要按照聲明來,誰先聲明用誰,也就是說B在C之前聲明,這個時候使用的是D1,反之則為D2
但是對應上面這些結(jié)果,大家不需要刻意去記它。因為不管Maven怎么選,最終的結(jié)果都會在Maven的Dependencies
面板中展示出來,展示的是哪個版本,也就是說它選擇的就是哪個版本
如果想更全面的查看Maven中各個坐標的依賴關(guān)系,可以點擊Maven面板中的show Dependencies
,
例如:
在這個視圖中就能很明顯的展示出jar包之間的相互依賴關(guān)系。
二、可選依賴和排除依賴
依賴傳遞介紹完以后,我們來思考一個問題,
- maven_02_ssm 依賴了 maven_04_dao
- maven_04_dao 依賴了 maven_03_pojo
- 因為現(xiàn)在有依賴傳遞,所以maven_02_ssm能夠使用到maven_03_pojo的內(nèi)容
- 如果說現(xiàn)在不想讓maven_02_ssm依賴到maven_03_pojo,有哪些解決方案?
說明:在真實使用的過程中,maven_02_ssm中是需要用到maven_03_pojo的,我們這里只是用這個例子描述我們的需求。因為有時候,maven_04_dao出于某些因素的考慮,就是不想讓別人使用自己所依賴的maven_03_pojo。
方案一:可選依賴
可選依賴指對外隱藏當前所依賴的資源---指不透明
在maven_04_dao
的pom.xml,在引入maven_03_pojo
的時候,添加optional
<dependency> ? ?<groupId>com.itheima</groupId> ? ?<artifactId>maven_03_pojo</artifactId> ? ?<version>1.0-SNAPSHOT</version> ? ?<!--可選依賴是隱藏當前工程所依賴的資源,隱藏后對應資源將不具有依賴傳遞--> ? ?<optional>true</optional> </dependency>
此時就出問題了,說明由于maven_04_dao將maven_03_pojo設置成可選依賴,導致maven_02_ssm無法引用到maven_03_pojo中的內(nèi)容,導致需要的類找不到。
方案二:排除依賴
- 排除依賴指主動斷開依賴的資源,被排除的資源無需指定版本---指不需要
前面我們已經(jīng)通過可選依賴實現(xiàn)了阻斷maven_03_pojo的依賴傳遞,對于排除依賴,則指的是已經(jīng)有依賴的事實,也就是說maven_02_ssm項目中已經(jīng)通過依賴傳遞用到了maven_03_pojo,此時我們需要做的是將其進行排除,所以接下來需要修改maven_02_ssm的pom.xml
<dependency> ? ?<groupId>com.itheima</groupId> ? ?<artifactId>maven_04_dao</artifactId> ? ?<version>1.0-SNAPSHOT</version> ? ?<!--排除依賴是隱藏當前資源對應的依賴關(guān)系--> ? ?<exclusions> ? ? ? ?<exclusion> ? ? ? ? ? ?<groupId>com.itheima</groupId> ? ? ? ? ? ?<artifactId>maven_03_pojo</artifactId> ? ? ? ?</exclusion> ? ?</exclusions> </dependency>
排除依賴資源僅需指定groupId,artifactId即可,不用指定version,會把不同的版本都排除掉
當然exclusions
標簽帶s
說明我們是可以依次排除多個依賴到的jar包,比如maven_04_dao中有依賴junit和mybatis,我們也可以一并將其排除。
<dependency> ? ?<groupId>com.itheima</groupId> ? ?<artifactId>maven_04_dao</artifactId> ? ?<version>1.0-SNAPSHOT</version> ? ?<!--排除依賴是隱藏當前資源對應的依賴關(guān)系--> ? ?<exclusions> ? ? ? ?<exclusion> ? ? ? ? ? ?<groupId>com.itheima</groupId> ? ? ? ? ? ?<artifactId>maven_03_pojo</artifactId> ? ? ? ?</exclusion> ? ? ? ?<exclusion> ? ? ? ? ? ?<groupId>log4j</groupId> ? ? ? ? ? ?<artifactId>log4j</artifactId> ? ? ? ?</exclusion> ? ? ? ?<exclusion> ? ? ? ? ? ?<groupId>org.mybatis</groupId> ? ? ? ? ? ?<artifactId>mybatis</artifactId> ? ? ? ?</exclusion> ? ?</exclusions> </dependency>
介紹我這兩種方式后,簡單來梳理下,就是
A依賴B,B依賴C
,C
通過依賴傳遞會被A
使用到,現(xiàn)在要想辦法讓A
不去依賴C
- 可選依賴是在B上設置
<optional>
,A
不知道有C
的存在,代表這個依賴是否需要被發(fā)現(xiàn)。這種適用于可以修改B的配置文件的情況下 - 排除依賴是在A上設置
<exclusions>
,A
知道有C
的存在,主動將其排除掉。代表這個依賴已經(jīng)被發(fā)現(xiàn),但自己是否需要引用。這種適用于不能修改B的配置文件的情況下
到此這篇關(guān)于Java Maven依賴傳遞,可選依賴,排除依賴詳解的文章就介紹到這了,更多相關(guān)Java Maven依賴 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot實現(xiàn)自動郵件發(fā)送任務詳解
這篇文章主要介紹了Springboot中的郵件任務,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2022-04-04JavaWeb中轉(zhuǎn)發(fā)與重定向的區(qū)別小結(jié)
轉(zhuǎn)發(fā)和重定向是JavaWeb中常用的兩種頁面跳轉(zhuǎn)方式,它們在實現(xiàn)上有一些區(qū)別,本文主要介紹了JavaWeb中轉(zhuǎn)發(fā)與重定向的區(qū)別小結(jié),具有一定的參考價值,感興趣的可以了解一下2023-10-10SpringMVC框架中使用Filter實現(xiàn)請求日志打印方式
這篇文章主要介紹了SpringMVC框架中使用Filter實現(xiàn)請求日志打印方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10