有人可以给我一个简单的build.gradle示例,说明我如何指定运行时部署(war)中未包含的仅编译时类。
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.+ 和 gradle 1.11主要项目使用亚马逊广告和亚马逊应用内购买。它取决于使用亚马逊设备消息传递 (ADM) 的库项目。
我的主要问题是ADM,我得到了"运行时异常:存根!"错误。
1.) 图书馆项目:正如他所说,卢卡斯提出的"提供的配置"不起作用,所以我使用了理查兹的方法,然而这种方法开箱即用。我不得不稍微更改一下,因为我在 aar 文件的 ext_libs 文件夹中找不到库。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 中进行几行配置。我建议在 Gradle 论坛上搜索provided
.
听起来你真正想要的是声明构建的依赖项,而不是编译类路径的依赖项。如何做到这一点取决于如何调用所需的功能(Ant 任务、Gradle 任务/插件、构建脚本中的临时使用)。如果你提供更详细的信息,说明你要做什么,我可以提供一个更具体的答案。
以下是 Gradle 用户指南中相关信息的一些链接:
- 生成脚本的外部依赖项
- 声明定制 Ant 任务的类路径
如果使用 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
}
它编译完美,提供的/库.jar不包含在最终的apk中。我遇到的唯一问题是通知Android工作室库.jar的存在。这个想法插件似乎不适用于安卓工作室。我猜他们有另一个自定义插件,用于将 gradle 与工作室同步。
找到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"
}