2015-06-09 192 views
5

我在我面前有build.gradle,並且存在一些聲明爲provided的依賴關係,但是在documentation中我沒有看到此依賴範圍。'提供'在Gradle中的依賴關係

dependencies { 
    compile("org.springframework.boot:spring-boot-starter-web:1.2.4.RELEASE") 
    .... 

    provided 'backport-util-concurrent:backport-util-concurrent:3.1' 
    provided 'org.javolution:javolution:[email protected] 
    .... 
} 

這是由插件提供的嗎?如果是這樣,我怎麼知道這是哪個插件?

providedruntime Gradle中的依賴範圍有什麼區別?

+1

你有一個名爲'provided'的配置嗎? – Opal

+0

我想我不明白你的意思是什麼樣的配置。 –

+0

我的意思是在'配置'塊中有一個名爲'provided'的條目。你能否粘貼整個'build.gradle'腳本? – Opal

回答

16

什麼是provided範圍?

假設編譯代碼需要jar,但該jar存在於生產環境庫集合中。那麼你不需要將jar包與你的項目檔案打包在一起。爲了支持這個需求,Maven的作用域爲provided。如果你聲明任何jar依賴項爲provided,那麼這個jar將在編譯期間出現在你的類路徑中,但不會與你的項目歸檔一起打包。

provided範圍非常有用,特別是在Web應用程序中。例如,servlet-api.jar需要存在於您的類路徑中才能編譯您的項目,但您不需要將servlet-api.jar文件與war一起打包。用provided範圍可以達到這個要求。

Gradle java插件中沒有定義範圍provided。也不在warandroid插件中。如果您想在項目中使用provided範圍,則必須在build.gradle文件中對其進行定義。以下是代碼片段聲明provided範圍的gradle中:

configurations { 
    provided 
} 

sourceSets { 
    main { compileClasspath += configurations.provided } 
} 

現在,你的第二個問題:

是什麼在搖籃提供和運行依賴範圍之間的區別?

要首先回答這個問題,我將定義compile依賴關係。 compile依賴關係是依賴項,這些是編譯你的代碼所必需的。現在想象一下,如果你的代碼使用了一個名爲X的庫,那麼你必須聲明X作爲你的編譯時間依賴。另外想象一下,X在內部使用另一個庫Y,並且您將Y聲明爲您的運行時依賴項。

在編譯期間,Gradle會將X添加到您的類路徑中,但不會添加Y。因爲編譯時不需要Y。但它會將XY與您的項目存檔打包在一起,因爲XY是在生產環境中運行項目存檔所必需的。通常,生產環境中所需的所有依賴關係都稱爲runtime依賴關係。

在搖籃官方documentation,它說,runtime依賴是「在運行時由生產類所需的依賴關係。在默認情況下,還包括編譯時的依賴。」。現在

,如果你瞭解了這些內容,那麼你已經知道providedcompile依賴,我們不希望出現在runtime依賴(基本上,我們不希望它一起打包項目檔案)。

以下是providedruntime範圍的說明。這裏,compile指的是編譯項目所需的依賴關係,non-compile指的是項目編譯不需要的依賴關係。