Maven Scope 取值范圍小結
在Maven項目的pom.xml文件中,通常會給dependency設置scope屬性,規(guī)定依賴jar包的使用范圍。
scope有以下5個取值:
1、compile(默認值)
- 被依賴項目需要參與到當前項目的編譯。
- 適用于所有階段:測試,打包,運行。
2、provided:
- 含義:被依賴項目理論上可以參與編譯、測試、運行等階段,相當于compile,但是在打包階段做了exclude的動作。
- 適用場景:例如, 如果我們在開發(fā)一個web 應用,在編譯時我們需要依賴 servlet-api.jar,但是在運行時我們不需要該 jar 包,因為這個 jar 包已由應用服務器提供,此時我們需要使用 provided 進行范圍修飾(JDK 或者一個容器已提供該依賴)。
3、test
- 含義:表示被依賴項目僅僅參與測試相關的工作
- 適用階段:適用于測試階段的編譯、運行,項目打包時不會加入
- 適用場景:如junit
4、runtime
- 適用階段:運行、測試,編譯階段不適用
- 適用場景:例如,在編譯的時候我們不需要 JDBC API 的 jar 包,而在運行的時候我們才需要 JDBC 驅動包。
5、system
- system 元素與 provided 元素類似,但是被依賴項不會從 maven 倉庫中查找,而是從本地系統(tǒng)中獲取,systemPath 元素用于制定本地系統(tǒng)中 jar 文件的路徑
6、import
它只使用在<dependencyManagement>中,表示從其它的pom中導入dependency的配置,例如 (B項目導入A項目中的包配置):
想必大家在做SpringBoot應用的時候,都會有如下代碼:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.3.RELEASE</version>
</parent>
繼承一個父模塊,然后再引入相應的依賴。
假如說,我不想繼承,或者我想繼承多個,怎么做?
我們知道Maven的繼承和Java的繼承一樣,是無法實現(xiàn)多重繼承的,如果10個、20個甚至更多模塊繼承自同一個模塊,那么按照我們之前的做法,這個父模塊的dependencyManagement會包含大量的依賴。如果你想把這些依賴分類以更清晰的管理,那就不可能了,import scope依賴能解決這個問題。你可以把dependencyManagement放到單獨的專門用來管理依賴的pom中,然后在需要使用依賴的模塊中通過import scope依賴,就可以引入dependencyManagement。例如可以寫這樣一個用于依賴管理的pom:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.test.sample</groupId>
<artifactId>base-parent1</artifactId>
<packaging>pom</packaging>
<version>1.0.0-SNAPSHOT</version>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactid>junit</artifactId>
<version>4.8.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactid>log4j</artifactId>
<version>1.2.16</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
然后我就可以通過非繼承的方式來引入這段依賴管理配置
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.test.sample</groupId>
<artifactid>base-parent1</artifactId>
<version>1.0.0-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>junit</groupId>
<artifactid>junit</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactid>log4j</artifactId>
</dependency>
注意:import scope只能用在dependencyManagement里面
這樣,父模塊的pom就會非常干凈,由專門的packaging為pom來管理依賴,也契合的面向對象設計中的單一職責原則。此外,我們還能夠創(chuàng)建多個這樣的依賴管理pom,以更細化的方式管理依賴。這種做法與面向對象設計中使用組合而非繼承也有點相似的味道。
那么,如何用這個方法來解決SpringBoot的那個繼承問題呢?
配置如下:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.3.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
這樣配置的話,自己的項目里面就不需要繼承SpringBoot的module了,而可以繼承自己項目的module了。
到此這篇關于Maven Scope 取值范圍的文章就介紹到這了,更多相關Maven Scope 取值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java Collections集合繼承結構圖_動力節(jié)點Java學院整理
這篇文章主要介紹了Java Collections集合繼承結構圖_動力節(jié)點Java學院整理,需要的朋友可以參考下2017-04-04
java POI 如何實現(xiàn)Excel單元格內(nèi)容換行
這篇文章主要介紹了java POI 如何實現(xiàn)Excel單元格內(nèi)容換行的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
Mybatis-plus通過添加攔截器實現(xiàn)簡單數(shù)據(jù)權限
系統(tǒng)需要根據(jù)用戶所屬的公司,來做一下數(shù)據(jù)權限控制,具體一點,就是通過表中的company_id進行權限控制,項目使用的是mybatis-plus,所以通過添加攔截器的方式,修改查詢sql,實現(xiàn)數(shù)據(jù)權限,本文就通過代碼給大家詳細的講解一下,需要的朋友可以參考下2023-08-08
web.xml?SpringBoot打包可執(zhí)行Jar運行SpringMVC加載流程
這篇文章主要為大家介紹了web.xml?SpringBoot打包可執(zhí)行Jar運行SpringMVC加載流程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04
SpringBoot異步調(diào)用方法實現(xiàn)場景代碼實例
這篇文章主要介紹了SpringBoot異步調(diào)用方法實現(xiàn)場景代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-04-04

