<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
scope元素的作用:控制 dependency 元素的使用範圍。通俗的講,就是控制 jar 包在哪些範圍被載入和使用。
scope具體含義如下:
compile(預設)
含義:compile 是預設值,如果沒有指定 scope 值,該元素的預設值為 compile。被依賴專案需要參與到當前專案的編譯,測試,打包,執行等階段。打包的時候通常會包含被依賴專案。
provided
含義:被依賴專案理論上可以參與編譯、測試、執行等階段,相當於compile,但是再打包階段做了exclude的動作。
適用場景:例如, 如果我們在開發一個web 應用,在編譯時我們需要依賴 servlet-api.jar,但是在執行時我們不需要該 jar 包,因為這個 jar 包已由應用伺服器提供,此時我們需要使用 provided 進行範圍修飾。
runtime
含義:表示被依賴專案無需參與專案的編譯,但是會參與到專案的測試和執行。與compile相比,被依賴專案無需參與專案的編譯。
適用場景:例如,在編譯的時候我們不需要 JDBC API 的 jar 包,而在執行的時候我們才需要 JDBC 驅動包。
test
含義: 表示被依賴專案僅僅參與測試相關的工作,包括測試程式碼的編譯,執行。
適用場景:例如,Junit 測試。
system
含義:system 元素與 provided 元素類似,但是被依賴項不會從 maven 倉庫中查詢,而是從本地系統中獲取,systemPath 元素用於制定本地系統中 jar 檔案的路徑。例如:
<dependency> <groupId>org.open</groupId> <artifactId>open-core</artifactId> <version>1.5</version> <scope>system</scope> <systemPath>${basedir}/WebContent/WEB-INF/lib/open-core.jar</systemPath> </dependency>
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的繼承一樣,是無法實現多重繼承的,如果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來管理依賴,也契合的物件導向設計中的單一職責原則。此外,我們還能夠建立多個這樣的依賴管理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了。
scope的依賴傳遞
A–>B–>C。當前專案為A,A依賴於B,B依賴於C。知道B在A專案中的scope,那麼怎麼知道C在A中的scope呢?答案是:
當C是test或者provided時,C直接被丟棄,A不依賴C;
否則A依賴C,C的scope繼承於B的scope。
下面是一張nexus畫的圖。
到此這篇關於Maven依賴中scope的含義的文章就介紹到這了,更多相關Maven scope內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45