2012-05-01 50 views
62

有人可以給我一個簡單的build.gradle示例,說明如何指定未包含在運行時部署(war)中的僅編譯時類。如何在Gradle中定義編譯時* only *類路徑?

由於'運行時'從'compile'繼承,所以Gradle似乎錯誤地採用了這種方法。我無法想象在運行時需要類的情況,我不想在編譯時使用這些類。但是,在很多情況下,我需要在編譯時生成代碼的類,我不希望在運行時進行部署!

我翻遍了臃腫的gradle文檔,但找不到任何明確的說明或示例。我懷疑這可能是通過定義一個'配置'並將其設置爲CompileJava插件的類路徑來實現的 - 但是文檔在解釋如何實現這一點方面不足。

+2

我認爲當前最新的正確答案是使用compileOnly配置的xsveda。 – Robert

回答

56

關於這個話題已經有很多討論,主要是here,但是沒有明確結論。

你是在正確的軌道上:目前最好的解決辦法是聲明自己provided的配置,這將包括編譯只依賴,並添加到您的編譯類路徑:

configurations{ 
    provided 
} 

dependencies{ 
    //Add libraries like lombok, findbugs etc 
    provided '...' 
} 

//Include provided for compilation 
sourceSets.main.compileClasspath += [configurations.provided] 

// optional: if using 'idea' plugin 
idea { 
    module{ 
    scopes.PROVIDED.plus += [configurations.provided] 
    } 
} 

// optional: if using 'eclipse' plugin 
eclipse { 
    classpath { 
    plusConfigurations += [configurations.provided] 
    } 
} 

這通常效果很好。

+0

這個效果非常好。 – oers

+3

有沒有人得到這個與Android Studio和Gradle 1.9一起工作? –

+0

您可以在幾個網站上找到提供的範圍定義。但ide插件幫助了我很多! – vvursT

6

具有非編譯時間依賴性的運行時相關性是非常普遍的。另一種方式是一個相當特殊的情況,因此需要在Gradle中進行幾行配置。我建議搜索Gradle forumprovided

這聽起來像你真的是聲明你的生成,而不是編譯類路徑的依賴關係。這是如何完成的取決於如何調用所需的功能(Ant任務,Gradle任務/插件,從構建腳本臨時使用)。如果您提供了更多關於您正在嘗試做什麼的詳細信息,我可以提供更具體的答案。

這裏有一些鏈接到相關信息的搖籃用戶指南:

6

如果使用WAR插件,你可以在這個example

使用 providedCompile作爲
dependencies { 
    compile module(":compile:1.0") { 
     dependency ":[email protected]" 
     dependency ":providedCompile-transitive:[email protected]" 
    } 
    providedCompile "javax.servlet:servlet-api:2.5" 
    providedCompile module(":providedCompile:1.0") { 
     dependency ":providedCompile-transitive:[email protected]" 
    } 
    runtime ":runtime:1.0" 
    providedRuntime ":providedRuntime:[email protected]" 
    testCompile "junit:junit:4.11" 
    moreLibs ":otherLib:1.0" 
} 
2

我沒有找到針對Android Studio中的一個解決方案,但這個是我的嘗試:

在Android Studio中,我不得不更新到0.5版本+

的gradle中/ gradle-wrapper.properties

更換

distributionUrl=http\://services.gradle.org/distributions/gradle-1.9-rc-3-bin.zip 

通過

distributionUrl=http\://services.gradle.org/distributions/gradle-1.11-all.zip 
在我所有的構建

。gradle這個替代

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:0.7.+' 
    } 
} 

通過

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:0.9.+' 
    } 
} 

,並在圖書館,我想利用提供

configurations { 
    provided 
} 

//put applicationVariants in case it is apply plugin: 'android' and not apply plugin: 'android-library' 
android.libraryVariants.all { 
    variant -> variant.javaCompile.classpath += configurations.provided 
} 

dependencies { 
    provided files('ext_libs/amazon-device-messaging-1.0.1.jar') 
} 

,並在它不工作的結束,似乎它適用於罐子但不爲這裏陳述的aar或apk https://groups.google.com/forum/#!topic/adt-dev/WIjtHjgoGwA

0

我們不需要「提供」,請嘗試添加:

android.libraryVariants.all { variant -> 
    variant.packageLibrary.exclude('ext_libs/amazon-device-messaging-1.0.1.jar') 
} 

享受!

9

我想出了我的項目設置。 我使用的Android Studio使用gradle插件0.9。+使用Gradle 1.11 主要項目使用亞馬遜廣告和amazon inapp購買。 它取決於使用亞馬遜設備消息傳遞(ADM)的庫項目。

我的主要問題是ADM遇到了「RuntimeException:Stub!」錯誤。

1.)圖書館計劃: Lukas提出的「提供的配置」並不奏效,正如他所說的那樣,所以我使用了Richards的方法,但是這種方法在開箱即用時效果不佳。由於我無法在aar文件的ext_libs文件夾中找到lib,所以我不得不改變它。 Gradle似乎將最後的aar文件中libs文件夾中的所有庫打包。

android.libraryVariants.all { variant -> 
variant.packageLibrary.exclude('libs/amazon-device-messaging-1.0.1.jar') 
} 

2)申請項目: 這裏,用 「提供的配置」 的方式工作。

configurations{ 
    provided 
} 
dependencies { 
    compile 'fr.avianey:facebook-android-api:[email protected]' 
    compile files('ext_libs/amazon-ads-5.3.22.jar') 
    compile files('ext_libs/in-app-purchasing-1.0.3.jar') 
    provided files('ext_libs/amazon-device-messaging-1.0.1.jar') 
} 

android.applicationVariants.all { 
    variant -> variant.javaCompile.classpath += configurations.provided 
} 
+0

我可以證實,解決exlude庫作品應用插件:'com.android。庫「,訣竅是將它從」庫「中排除,即使你在任何其他文件夾中都有lib,就像上面寫的gradle將它們全部放到libs文件夾中一樣。非常感謝邁克。 –

0

的OP顯然沒有找一個Android的答案,但一些答案是具體到Android。所以我建議你看看這個頁面:http://tools.android.com/tech-docs/new-build-system

版本0.9.0引入了一個提供的範圍。因此,只要使用

dependencies { 
    provided "groupId:artifcatId:version" 
} 
3

事實證明,他們在gradle這個Android插件0.8.0增加了「提供的」配置,但它不是做得比較工作。它會自動將所提供的庫添加到編譯路徑中,但它也會將它們包含在最終的aar/apk中。

對我來說有效的是@ lukas-hanaceck提供的解決方案,但是將名稱從「provided」更改爲任何其他自定義名稱。在我的情況下,這是一個庫項目,它是我最終的Android應用程序項目的依賴項。這是我爲什麼工作的要點。

configurations { 
    providedlibs 
} 

dependencies { 
    providedlibs files('provided/library.jar') 
} 

libraryVariants.all { 
    variant -> variant.javaCompile.classpath += configurations.providedlibs 
} 

它編譯完全和所提供的/ library.jar不被包括在最後的APK。我遇到的唯一問題是通知Android Studio存在library.jar。這個插件似乎不適用於Android工作室。我猜測他們有另一個自定義插件用於與工作室同步Gradle。

+0

我確認股票'提供的'Android Gradle ** 1.0.1 **配置確實出現在編譯類路徑中,但是隨後強制自己進入APK,這違背了目的。 其中很多答案都非常相似。我用這個作爲模板,它對我來說工作得很好。它適用於jar(遠程和本地)依賴項,但不適用於AAR。作爲解決方法,我最終將AAR中的classes.jar炸開。 –

11

如果您使用戰爭插件,providedCompile應該做的伎倆。 但是,如果您需要排除jar中包含的依賴項,則必須擴展jar任務。 下面是用於構建「胖罐」或「超級罐」(單罐,其包括它的依賴的所有類)的示例不含depndencies標記provided

configurations { 
    provided 
    compile.extendsFrom provided 
} 

dependencies { 
    provided "group.artifact:version" 
    compile "group.artifact:version" 
} 

jar { 
    dependsOn configurations.runtime 
    from { 
     (configurations.runtime - configurations.provided).collect { 
      it.isDirectory() ? it : zipTree(it) 
     } 
    } 
} 

信用:http://kennethjorgensen.com/blog/2014/fat-jars-with-excluded-dependencies-in-gradle/

更新:

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

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

這是迄今爲止最好的一般/非Android的答案。對編譯時需要依賴關係的hadoop和storm庫非常有用,但需要從jar中排除。 – Nathan

2

在Android Studio中1.0做到這一點:

android.libraryVariants.all { variant -> 
    variant.outputs.each { output -> 
     output.packageLibrary.exclude('libs/someLib.jar') 
    } 
} 
+0

沒有爲我工作:( – Almo

5

在搖籃2.12 compileOnly配置已經出臺。博客文章介紹這個功能可以在這裏找到:

Gradle latest feature: Compile only dependencies

請注意一個重要的副作用:

由於添加了「compileOnly」配置,所造成的「編譯「配置不再代表所有編譯時間依賴關係的完整畫面。當需要在構建腳本或自定義插件中引用編譯類路徑時,應該使用相應的源集的compileClasspath屬性。

相關問題