一栖榨、Maven scope依賴范圍概覽
Maven的生命周期存在編譯昆汹、測(cè)試、運(yùn)行這些過程,那么顯然有些依賴只用于測(cè)試婴栽,比如junit满粗;有些依賴編譯用不到,只有運(yùn)行的時(shí)候才能用到居夹,比如mysql的驅(qū)動(dòng)包在編譯期就用不到(編譯期用的是JDBC接口)败潦,而是在運(yùn)行時(shí)用到的;還有些依賴准脂,編譯期要用到劫扒,而運(yùn)行期不需要提供,因?yàn)橛行┤萜饕呀?jīng)提供了狸膏,比如servlet-api在tomcat中已經(jīng)提供了沟饥,我們只需要的是編譯期提供而已。總結(jié)說來贤旷,在POM 4中广料,<dependency>
中還引入了<scope>
,它主要管理依賴的部署幼驶。大致有compile艾杏、provided、runtime盅藻、test购桑、system等幾個(gè)。
compile:默認(rèn)的scope氏淑,運(yùn)行期有效勃蜘,需要打入包中
provided:編譯期有效,運(yùn)行期不需要提供假残,不會(huì)打入包中
runtime:編譯不需要缭贡,在運(yùn)行期有效,需要導(dǎo)入包中辉懒。(接口與實(shí)現(xiàn)分離)
test:測(cè)試需要阳惹,不會(huì)打入包中
system:非本地倉(cāng)庫(kù)引入、存在系統(tǒng)的某個(gè)路徑下的jar耗帕。(一般不使用)
二穆端、scope依賴范圍詳解
2.1 compile
默認(rèn)就是compile,什么都不配置也就是意味著compile仿便。compile表示被依賴項(xiàng)目需要參與當(dāng)前項(xiàng)目的編譯体啰,當(dāng)然后續(xù)的測(cè)試,運(yùn)行周期也參與其中嗽仪,是一個(gè)比較強(qiáng)的依賴荒勇。打包的時(shí)候通常需要包含進(jìn)去,該依賴需要參與當(dāng)前項(xiàng)目的編譯闻坚、測(cè)試沽翔、運(yùn)行、打包窿凤。
2.2 provided
provided 表明該依賴已經(jīng)提供仅偎,故只在未提供時(shí)才被使用,應(yīng)用場(chǎng)景是你定義了一個(gè)Servlet雳殊,此刻得需要Servlet-api.jar 才能編譯成功橘沥,但是當(dāng)你達(dá)成war 包時(shí),你并不想將 Servlet-api.jar 包進(jìn)去夯秃,因?yàn)門omcat等容器會(huì)提供跟compile 類似座咆,說明JDK痢艺、容器或使用者會(huì)提供這個(gè)依賴,如Servlet.jar介陶。這個(gè)依賴只作用在** 編譯和測(cè)試堤舒,該依賴會(huì)由系統(tǒng)組件提供,不需手動(dòng)添加哺呜,只存在編譯舌缤、運(yùn)行、測(cè)試階段弦牡,打包是不用包進(jìn)去友驮,打包階段做了exclude**動(dòng)作漂羊。provided意味著打包的時(shí)候可以不用包進(jìn)去驾锰,別的設(shè)施(Web Container)會(huì)提供。
2.3 runtime
runntime表示被依賴項(xiàng)目無需參與項(xiàng)目的編譯走越,不過后期的測(cè)試和運(yùn)行周期需要其參與椭豫。與compile相比,跳過編譯而已旨指,比如赏酥,你可能在編譯的時(shí)候只需要JDBC API JAR,而只有在運(yùn)行的時(shí)候才需要JDBC驅(qū)動(dòng)實(shí)現(xiàn)谆构。編譯時(shí)該包不參與裸扶,運(yùn)行時(shí)參與。
2.4 test
test范圍依賴 在一般的編譯和運(yùn)行時(shí)都不需要搬素,它們只有在測(cè)試編譯和測(cè)試運(yùn)行階段可用呵晨。
2.5 system
被依賴項(xiàng)不會(huì)從maven倉(cāng)庫(kù)下載,而是從本地系統(tǒng)指定路徑下尋找熬尺,需要 systemPath 屬性system范圍依賴與provided 類似摸屠,但是你必須顯式的提供一個(gè)對(duì)于本地系統(tǒng)中JAR 文件的路徑,這么做是為了允許基于本地對(duì)象編譯粱哼,而這些對(duì)象是系統(tǒng)類庫(kù)的一部分季二。這樣的構(gòu)件應(yīng)該是一直可用的,Maven 也不會(huì)在倉(cāng)庫(kù)中去尋找它從參與度來說揭措,與provided相同胯舷,不過被依賴項(xiàng)不會(huì)從maven倉(cāng)庫(kù)抓,而是從本地文件系統(tǒng)拿绊含,一定需要配合systemPath屬性使用桑嘶,例如:
<!-- 引入本地jar -->
<dependency>
<groupId>com.oppo</groupId>
<artifactId>opush-server-sdk</artifactId>
<version>1.0.6</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/opush-server-sdk-1.0.6.jar</systemPath>
</dependency>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
三、maven預(yù)定義內(nèi)置屬性
${basedir}
表示項(xiàng)目根目錄,即包含pom.xml文件的目錄;${version}
表示項(xiàng)目版本;${project.basedir}
同${basedir};${project.baseUri}
表示項(xiàng)目文件地址;${maven.build.timestamp}
表示項(xiàng)目構(gòu)件開始時(shí)間;${maven.build.timestamp.format}
表示屬性${maven.build.timestamp}
的展示格式,默認(rèn)值為yyyyMMdd-HHmm,可自定義其格式