2012-12-18 46 views
36

我想爲許多項目重用某些過濾器,所以我想提取它並使用一個jar將它添加到任何Web App。providedCompile without war插件

建築我使用的搖籃1.3及以下build.gradle文件:

apply plugin: 'java' 

dependencies { 

    compile group:'org.slf4j', name:'slf4j-api', version:'1.7.+' 

    testCompile group:'junit', name:'junit', version:'4.+' 

    compile group:'org.springframework', name:'spring-web', version:'3.+' 

    compile group:'org.slf4j', name:'slf4j-log4j12', version:'1.6.+' 
    compile group:'log4j', name:'log4j', version:'1.2.+' 

    providedCompile group: 'javax.servlet', name: 'javax.servlet-api', version:'3.+'   

} 

repositories { 

    mavenCentral() 

} 

正如你所看到的,我需要在Servlet API來編譯這個過濾器成功地讓我想添加它像一個行家提供的依賴。

不管怎麼說,運行gradle build後,我收到以下錯誤:

Could not find method providedCompile() for arguments [{group=javax.servlet, name=javax.servlet-api, version=3.+}] on root project 'hibernate-conversation-context'.

現在,我知道我不能沒有WAR插件使用providedCompile但我需要這個項目是一個簡單的JAR。有沒有另一種方法來做到這一點?

+0

的可能的複製[如何定義編譯-time \ * only \ * Gradle中的classpath?](http://stackoverflow.com/questions/10405970/how-do-i-define-a-compile-time-only-classpath-in-gradle) –

回答

48

java插件沒有開箱即用的配置。但是你可以自己打造爲如下:

configurations { providedCompile } 

dependencies { 
    providedCompile "javax.servlet:javax.servlet-api:3.+" 
} 

sourceSets.main.compileClasspath += configurations.providedCompile 
sourceSets.test.compileClasspath += configurations.providedCompile 
sourceSets.test.runtimeClasspath += configurations.providedCompile 

這增加了配置,並把所有的依賴中有兩個主要的類和測試類的編譯類路徑。您還需要將其添加到runtimeClasspath中,因爲根據gradle DSL文檔不包括編譯類路徑。

+1

Just a警告人們此解決方案與Eclipse不兼容。 dty的答案顯示了讓它在那裏工作的方法。基本上只需添加: eclipse.classpath.plusConfigurations + =配置。提供編譯 到構建文件。 – IcedDante

+2

對於在Eclipse和IntelliJ中均可使用的解決方案,請參見: http://stackoverflow.com/a/25809968/2591231 –

+0

當我們想要添加對插件的支持時,事情就變得複雜起來。 Gradle 2.x構建於Groovy 2.3之上,不支持使用+ =將單個元素添加到集合中。這可能會導致失敗「無法更改配置」:提供'解決後'。在回答中+ =的用法是可以的,但如果你有這個錯誤,你可能需要在+ = with []後包裝右邊。請參閱此討論:https://discuss.gradle.org/t/custom-provided-configuration-not-working-with-gradle-2-0-rc2-in-multi-project-mode/2459 – virgo47

14

看看在搖籃插件propdeps from SpringSource。從項目描述:

Provides additional optional and provided dependency configurations for Gradle along with Maven POM generation support.

+0

感謝指針,來自SpringSource頁面的例子爲我解決了這個問題。我覺得很奇怪,Gradle沒有提供開箱即用的概念。 –

+0

這是一個直截了當的解決方案,但我發現它仍然導致提供的JAR打包到我的WAR中,我不希望發生這種情況。 –

5

還有一個更簡單的方法:

configurations {  
    provided 
    provided.extendsFrom(compile) 
} 

,然後您可以:

dependencies { 
    provided group: 'javax.servlet', name: 'javax.servlet-api', version:'3.+' 
} 

您還希望在生成的項目所提供的庫Eclipse或Idea的文件:

idea.module.scopes.PROVIDED.plus += configurations.provided 
eclipse.classpath.plusConfigurations += configurations.provided 
+0

沒有sourceSets-additions我沒有得到這個工作。我究竟做錯了什麼?儘管如此,感謝IDEA修復。 – stolsvik

+1

此外,Eclipse和IntelliJ修復程序現在需要圍繞它們的方括號,如下所示:'eclipse.classpath.plusConfigurations + = [configurations.provided]' – stolsvik

4

爲了使javadoc的工作,我必須補充一點:

javadoc.classpath=sourceSets.main.compileClasspath 
+0

在build.gradle文件中接受上述接受的答案之後。謝謝。 – Snicolas

5

當你發現自己使用搖籃2.12,變「providedCompile」到「compileOnly」。

12

由於搖籃2.12定義只編譯依賴的問題是由新的「copmpileOnly」配置終於解決了一個簡單而自然的方式:

dependencies { 
    compileOnly 'javax.servlet:servlet-api:2.5' 
} 
+1

這應該是可以接受的答案 –