如何在Gradle中定义编译时*仅*类路径?

Ale*_*den 62 compilation classpath gradle

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

由于'运行时'继承自'compile',Gradle似乎已经采用了错误的方法.我无法想象在运行时我想要在编译时不想要的类的情况.但是,在很多情况下我需要类在编译时生成代码,我不希望在运行时部署它们!

我已经浏览了膨胀的gradle文档,但找不到任何明确的说明或示例.我怀疑这可能是通过定义'配置'并将其设置为CompileJava插件的类路径来实现的 - 但是文档不能解释如何实现这一点.

rod*_*ion 56

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

您走在正确的轨道上:目前最好的解决方案是声明您自己的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]
  }
}
Run Code Online (Sandbox Code Playgroud)

通常这很好用.

  • 有没有人得到这个与Android Studio和gradle 1.9一起工作? (3认同)
  • **Gradle3:**`sourceSets.main.compileClasspath + = configurations.provided` (2认同)

Dor*_*old 12

如果你使用war插件,providedCompile应该做的伎俩.但是,如果您需要排除包含在jar中的依赖项,则必须扩展该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)
        }
    } 
}
Run Code Online (Sandbox Code Playgroud)

图片来源:http://kennethjorgensen.com/blog/2014/fat-jars-with-excluded-dependencies-in-gradle/

更新:

Gradle 2.12开始,定义仅编译依赖项的问题最终通过新的"copmpileOnly"配置以简单而自然的方式解决:

dependencies {
    compileOnly 'javax.servlet:servlet-api:2.5'
}
Run Code Online (Sandbox Code Playgroud)

  • 这是迄今为止最好的通用/非安卓答案.对于hadoop和storm库非常有用,在编译时需要依赖,但需要从jar中排除. (4认同)

Mik*_*e T 9

我想出了我的项目设置.我使用带有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' )
}
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*ser 6

拥有不是编译时依赖项的运行时依赖项是很常见的.反过来说是一个相当特殊的情况,因此在Gradle中需要几行配置.我建议搜索摇篮论坛provided.

听起来你真正想要的是为你的构建声明依赖,而不是为编译类路径.如何完成这取决于如何调用所需的功能(Ant任务,Gradle任务/插件,从构建脚本临时使用).如果您提供有关您要执行的操作的更详细信息,我可以提供更具体的答案.

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


Adr*_* H. 6

如果使用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"
}
Run Code Online (Sandbox Code Playgroud)


xsv*_*eda 6

在Gradle 2.12中,compileOnly引入了一种配置.可以在此处找到介绍此功能的博客文章:

Gradle最新功能:仅编译依赖项

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

由于添加了"compileOnly"配置,"compile"配置不再代表所有编译时依赖性的完整画面.当需要在构建脚本或自定义插件中引用编译类路径时,应该使用相应的源集的compileClasspath属性.