一、scopeprovided概述
在Maven的依賴管理範疇中,scopeprovided代表依賴關係的一種「範疇」,與被依賴項目的編譯構建不帶來實際用處的依賴關係,通常以optional或provided為屬性。
換句話說,scopeprovided設定的依賴關係只在編譯期和測試期中生效,並在運行時被丟棄。這意味著,該依賴項只在項目的編譯和測試中有效。
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
在上面的代碼例子中,與servlet-api相關聯的依賴項的作用僅限於編譯和測試,在運行時不會被打包。如果用戶所在的容器已經包含了servlet-api的庫,就不必將它打包進war文件中,因此該依賴此時可用於編譯,但不用於部署。
二、scopeprovided的使用場景
1.與Java標準庫相關的依賴庫
與應用程序運行環境相關的庫,比如Java標準庫,即使沒有將其作為Maven依賴項導入,Java運行時環境也將它們提供給應用程序。
例如,如果我們想要為servlet應用程序設置ContextPath,則只需要導入web.xml文件就可以了,這樣就可以通過web伺服器運行和測試應用程序。在這種情況下,servlet-api與Java標準庫相關,因此我們可以將其聲明為provided,而不必將其打包到生產環境中:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
2.減少部署時的依賴項
當項目打算部署時,我們通常會將其從測試環境中移植到生產環境中。在此過程中,需要將我們已經編譯過的代碼移植到生產環境,並將所有依賴庫(除Java標準庫之外)放在一個classpath中。一般來說,同樣的依賴包會被多個依賴庫中所使用,無需重複下載或者打包到多個部署包中。因此為了提高效率,最好將所有這些依賴項打包在一個單獨的文件中,讓所有應用程序都可以共享它們而不用重複下載。
這就是scopeprovided的另一個用例:它能幫助我們僅將必須部署的依賴項打包到生產環境中,而不會重複打包在它們依賴的多個模塊中。我們可以使用該範疇來告訴Maven,一些依賴僅在JAR打包時有效,而不是在WAR或EAR打包時有效。
3.與插件相關的範疇
Maven插件是Maven生態系統中非常重要的一部分,Maven插件通常也會有自己的宿主環境(如Jetty或Tomcat)。在某些情況下,插件可能需要一些額外的依賴項來執行其任務。為了提供這些支持,將這些插件的依賴項聲明為插件的scopeprovided是有意義的,因為它將允許這些依賴項在插件代碼運行時被查找到,但不會被打包進用戶項目中。
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.4.31.v20200723</version>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</plugin>
</plugins>
三、範疇unused的缺陷
相對於範疇provided的優點, unused的範疇不僅編譯時用不到,並且test範疇通常代表著較大的測試代碼,而且通常不需要在運行時打包。因此,它的適用範圍通常更小。
然而,unused範疇的一個缺陷是無法自動刪除所有未使用的依賴項,一些用戶仍然有一些未刪除的垃圾文件,這會使項目變得醜陋,難以維護。
結論
範疇provided是作為Maven支持庫中最常用的範疇之一。在依賴管理中,scopeprovided 常見的使用場景是:與Java標準庫相關的依賴庫、減少部署時的依賴項、與插件相關的範疇。unused的範疇與之相比,它的使用範圍通常更小,且不能自動刪除未使用的依賴項,將文件留下來會使項目難以維護,變得醜陋。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/193169.html