如何在Gradle中定义一个编译时* only * classpath?
有人可以请给我一个简单的build.gradle示例,说明如何指定不包含在运行时部署(war)中的仅编译时类。
Gradle似乎已经得到了这个错误的方式,因为“运行时”从“compile”inheritance。 我无法想象的情况下,我想在运行时的类,我不想在编译时。 但是,在编译时需要类来生成代码的情况有很多,我不希望在运行时进行部署。
我翻遍了臃肿的gradle文档,但找不到任何明确的说明或示例。 我怀疑这可能是通过定义一个“configuration”并将其设置为CompileJava插件的类path来实现的,但是文档不能解释如何实现这一点。
关于这个话题已经有很多讨论,主要是在这里 ,但是没有明确的结论。
你在正确的轨道上:目前最好的解决scheme是声明你自己provided
configuration,这将包括仅编译的依赖关系,并添加到你的编译类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中,已经引入了compileOnly
configuration。 介绍这个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" }