簡體   English   中英

如何在Gradle中定義編譯時*僅*類路徑?

[英]How do I define a compile-time *only* classpath in Gradle?

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

由於'運行時'繼承自'compile',Gradle似乎已經采用了錯誤的方法。 我無法想象在運行時我想要在編譯時不想要的類的情況。 但是,在很多情況下我需要類在編譯時生成代碼,我不希望在運行時部署它們!

我已經瀏覽了膨脹的gradle文檔,但找不到任何明確的說明或示例。 我懷疑這可能是通過定義'配置'並將其設置為CompileJava插件的類路徑來實現的 - 但是文檔不能解釋如何實現這一點。

關於這個主題已經有很多討論,主要是在這里 ,但不是明確的結論。

您走在正確的軌道上:目前最好的解決方案是聲明您自己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]
  }
}

通常這很好用。

如果你使用war插件, providedCompile就可以了。 但是,如果您需要排除包含在jar中的依賴項,則必須擴展jar任務。 下面是一個用於構建“胖罐”或“超級罐”(包含其所有類依賴關系的單個罐)的示例,不包括標記的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/

更新:

Gradle 2.12開始 ,定義僅編譯依賴項的問題最終通過新的“copmpileOnly”配置以簡單而自然的方式解決:

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

我想出了我的項目設置。 我使用帶有gradle插件0.9的Android Studio運行。+帶有gradle 1.11主項目使用亞馬遜廣告和亞馬遜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:+@aar'
    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
}

擁有不是編譯時依賴項的運行時依賴項是很常見的。 反過來說是一個相當特殊的情況,因此在Gradle中需要幾行配置。 我建議搜索搖籃論壇provided

聽起來你真正想要的是為你的構建聲明依賴,而不是為編譯類路徑。 如何完成這取決於如何調用所需的功能(Ant任務,Gradle任務/插件,從構建腳本臨時使用)。 如果您提供有關您要執行的操作的更詳細信息,我可以提供更具體的答案。

以下是Gradle用戶指南中相關信息的一些鏈接:

如果使用WAR插件,則可以像本例中一樣使用providedCompile

dependencies {
    compile module(":compile:1.0") {
        dependency ":compile-transitive-1.0@jar"
        dependency ":providedCompile-transitive:1.0@jar"
    }
    providedCompile "javax.servlet:servlet-api:2.5"
    providedCompile module(":providedCompile:1.0") {
        dependency ":providedCompile-transitive:1.0@jar"
    }
    runtime ":runtime:1.0"
    providedRuntime ":providedRuntime:1.0@jar"
    testCompile "junit:junit:4.11"
    moreLibs ":otherLib:1.0"
}

在Gradle 2.12中,引入了compileOnly配置。 可以在此處找到介紹此功能的博客文章:

Gradle最新功能:僅編譯依賴項

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

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

事實證明,他們已經在gradle android插件0.8.0中添加了“提供”配置,但它不太有效。 它確實將提供的庫自動添加到編譯路徑中,但它也將它們包含在最終的aar / apk中。

對我有用的是@ lukas-hanaceck提供的解決方案,但是將名稱從“提供”更改為任何其他自定義名稱。 在我的例子中,這是一個庫項目,它是我最終的android應用程序項目的依賴項。 這是對我有用的一點要點。

configurations {
   providedlibs
}

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

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

它編譯完美,並且提供的/ library.jar不包含在最終的apk中。 我唯一的問題是通知Android工作室存在library.jar。 這個想法插件似乎不適用於Android工作室。 我猜他們有另一個自定義插件用於同步gradle和studio。

我沒有找到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

在我的所有build.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')
}

並且最后它不起作用,似乎它適用於jar但不適用於aar或apk,如此處所述https://groups.google.com/forum/#!topic/adt-dev/WIjtHjgoGwA

在Android Studio 1.0中執行以下操作:

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

我們不需要“提供”,嘗試添加:

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

請享用!

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

0.9.0版引入了提供的范圍。 所以,只需使用

dependencies {
    provided "groupId:artifcatId:version"
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM