如何在纯 Java gradle 模块中模拟 Android 的 productFlavors?

Zak*_*rdi 6 java android gradle android-gradle-plugin

我需要三种口味:

  • fake
  • staging
  • prod

fake将提供诸如FakeUser, 之类的类FakeUserDb- 这些类不会编译到prod风味中,这一点非常重要。

prod并且staging完全相同,除了我需要将不同的编译String urlprodvs 中staging

因此,我需要创建一个real既可以继承prod又可以staging继承的“抽象”风味。

这可以通过 android gradle 插件轻松完成,但我如何在纯 Java gradle 模块中做到这一点?

lan*_*ava 6

对于您想要的每种口味

  1. 创建一个SourceSet以便编译
  2. 使${flavour}Compile 配置扩展主compile配置(请参阅此处的表 45.6 了解由 java 插件创建的每个 SourceSet 的配置)
  3. 创建一个JarTask(使用风味作为分类器)
  4. 发布 jar 工件,以便可以通过分类器引用风味

就像是:

def flavours = ['fake', 'staging', 'prod']
flavours.each { String flavour ->
    SourceSet sourceSet = sourceSets.create(flavour)
    sourceSet.java {
       srcDirs 'src/main/java', "src/$flavour/java"
    }
    sourceSet.resources {
       srcDirs 'src/main/resources', "src/$flavour/resources"
    }
    Task jarTask = tasks.create(name: "${flavour}Jar", type: Jar) {
       from sourceSet.output
       classifier flavour
    }
    configurations.getByName("${flavour}Compile").extendsFrom configurations.compile
    configurations.getByName("${flavour}CompileOnly").extendsFrom configurations.compileOnly
    configurations.getByName("${flavour}CompileClasspath").extendsFrom configurations.compileClasspath
    configurations.getByName("${flavour}Runtime").extendsFrom configurations.runtime

    artifacts {
       archives jarTask
    }
    assemble.dependsOn jarTask
}
Run Code Online (Sandbox Code Playgroud)

然后,要在另一个项目中引用其中一种口味,您可以执行以下操作之一:

dependencies {
   compile project(path: ':someProject', configuration: 'fakeCompile')
   compile project(path: ':someProject', configuration: 'fakeRuntime')
   compile 'someGroup:someProject:1.0:fake'
   compile group: 'someGroup', name: 'someProject', version: '1.0', classifier: 'fake'
}
Run Code Online (Sandbox Code Playgroud)