2012-05-01 83 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属性。

相关问题