如何在Gradle中定义一个编译时* only * classpath?

有人可以请给我一个简单的build.gradle示例,说明如何指定不包含在运行时部署(war)中的仅编译时类。

Gradle似乎已经得到了这个错误的方式,因为“运行时”从“compile”inheritance。 我无法想象的情况下,我想在运行时的类,我不想在编译时。 但是,在编译时需要类来生成代码的情况有很多,我不希望在运行时进行部署。

我翻遍了臃肿的gradle文档,但找不到任何明确的说明或示例。 我怀疑这可能是通过定义一个“configuration”并将其设置为CompileJava插件的类path来实现的,但是文档不能解释如何实现这一点。

关于这个话题已经有很多讨论,主要是在这里 ,但是没有明确的结论。

你在正确的轨道上:目前最好的解决scheme是声明你自己providedconfiguration,这将包括仅编译的依赖关系,并添加到你的编译类path:

 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任务。 下面是一个构build“fat jar”或“uber 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”configuration以简单自然的方式得到解决:

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

我想出了我的项目设置。 我使用的Android Studio与gradle插件0.9。+与gradle 1.11主要项目使用亚马逊广告和亚马逊inapp购买。 这取决于使用亚马逊设备消息传递(ADM)的图书馆项目。

我的主要问题是在ADM中,我得到了“RuntimeException:Stub!” 错误。

1.)图书馆计划:Lukas提出的“提供的configuration”不像他所说的那样工作,所以我使用了Richards的方法,但是这个方法在开箱时并不奏效。 由于找不到aar文件的ext_libs文件夹中的lib,我不得不改变它。 Gradle似乎将最后的aar文件中的libs文件夹中的所有库打包。

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

2.)应用程序项目:在这里,“提供的configuration”的方法工作。

 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中进行几行configuration。 我build议search提供的Gradle论坛 。

这听起来像是你真的是声明你的构build依赖,而不是为编译类path。 这是如何完成的取决于如何调用所需的function(Ant任务,Gradle任务/插件,从构build脚本临时使用)。 如果你提供更多关于你正在做什么的详细信息,我可以提供一个更具体的答案。

以下是Gradle用户指南中相关信息的一些链接:

  • 构build脚本的外部依赖关系
  • 声明自定义Ant任务的类path

如果使用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中,已经引入了compileOnlyconfiguration。 介绍这个function的博客文章可以在这里find:

Gradle最新function:只编译依赖项

请注意一个重要的副作用:

由于增加了“compileOnly”configuration,“编译”configuration不再代表所有编译时间依赖关系的全貌。 当需要在构build脚本或自定义插件中引用编译类path时,应该使用相应的源集的compileClasspath属性。

事实certificate,他们已经在gradle android插件0.8.0中添加了一个“提供”的configuration,但它不工作。 它会自动将所提供的库添加到编译path,但它也包含在最后的aar / apk中。

对我来说,工作是由@ lukas-hanaceck提供的解决scheme,但将名称从“提供”更改为任何其他自定义名称。 在我的情况下,这是一个库项目,是我最终的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。

我没有findAndroid Studio的解决scheme,但这是我试过的:

在android工作室,我不得不更新到版本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显然没有find一个Android的答案,但一些答案是特定于Android。 所以我build议你看看这个网页: http : //tools.android.com/tech-docs/new-build-system

版本0.9.0引入了一个提供的范围。 所以,只要使用

 dependencies { provided "groupId:artifcatId:version" }