scopeprovided解析:探究依賴管理中scopeprovided的應用場景

一、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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-01 14:59
下一篇 2024-12-01 14:59

相關推薦

  • Unity3D 創建沒有 Terrain Tile 的場景

    這篇文章將會介紹如何在 Unity3D 中創建一個沒有 Terrain Tile 的場景,同時也讓讀者了解如何通過編程實現這個功能。 一、基礎概念 在 Unity3D 中,Terr…

    編程 2025-04-29
  • Python強制轉型的實現方法和應用場景

    本文主要介紹Python強制轉型的實現方法和應用場景。Python強制轉型,也叫類型轉換,是指將一種數據類型轉換為另一種數據類型。在Python中,強制轉型主要通過類型構造函數、轉…

    編程 2025-04-29
  • Access執行按鈕的實現方法及應用場景

    本文將詳細介紹Access執行按鈕的實現方法及其在實際應用場景中的使用方法。 一、創建Access執行按鈕的方法 在Access中,創建執行按鈕的方法非常簡單。只需要按照以下步驟進…

    編程 2025-04-27
  • 用Python繪製櫻花飄落場景

    本文介紹如何用Python繪製一個帶有櫻花飄落特效的場景,通過本文的學習,您將了解到如何使用Python的turtle庫來繪製圖形,以及如何運用數學和物理知識來實現櫻花的飄落效果。…

    編程 2025-04-27
  • 谷歌內核瀏覽器的特點及應用場景

    一、基礎特點 谷歌內核瀏覽器是指以谷歌瀏覽器內核( Blink )為基礎的瀏覽器,目前國內比較著名的應該是360瀏覽器、QQ瀏覽器、搜狗瀏覽器等。谷歌內核瀏覽器以快速、高效、穩定為…

    編程 2025-04-25
  • TCP應用場景詳解

    一、網路通信 TCP是一種可靠的傳輸協議,它保證了數據的可靠傳輸。在網路通信中,TCP協議被廣泛應用。例如,電子郵件、FTP文件傳輸、HTTP網頁瀏覽等都是基於TCP/IP協議的。…

    編程 2025-04-20
  • 策略模式應用場景的探討

    一、排序演算法 在實際開發中,我們需要對數據進行排序。常用的排序演算法有冒泡排序、插入排序、選擇排序、快速排序等。這些演算法雖然思路不同,但實現方式有相似之處——它們都需要進行比較,並按…

    編程 2025-04-12
  • 索引失效場景分析

    一、索引失效場景簡介 索引是資料庫優化的重要手段之一,通過對表中的列創建索引,可以提高查詢效率,加快數據檢索。然而,在實際使用中,索引也會失效,導致查詢變慢、CPU負載增加等問題,…

    編程 2025-04-12
  • 詳解stringutils.isempty的常見應用場景及內部實現

    一、簡介 stringutils.isempty是Apache commons-lang3庫中的一個實用函數,它用於判斷一個字元串是否為空或者null。在實際開發中,經常需要對字元…

    編程 2025-04-02
  • MySQL If Case函數及其應用場景

    一、IF函數 IF函數是MySQL中常用的條件判斷函數之一,語法如下: IF(expr1, expr2, expr3) 其中expr1為條件表達式,如果為真則返回expr2的結果,…

    編程 2025-02-27

發表回復

登錄後才能評論