Как подражать продукту AndroidFlavors в чистом модуле java gradle?

Мне нужно три аромата:

  • fake
  • staging
  • prod

fake будет предоставлять классы, такие как FakeUser , FakeUserDb – очень важно, чтобы эти классы не были скомпилированы в prod .

prod и staging полностью идентичны, за исключением того, что мне нужно скомпилировать другой String url в prod vs staging .

Итак, мне нужно создать «абстрактный» real вкус, который наследуют как prod и sting.

Это можно легко сделать с помощью плагина android gradle, но как я могу сделать это в чистом модуле java gradle?

Для каждого аромата вы захотите

  1. Создайте SourceSet, чтобы он был скомпилирован
  2. Создайте конфигурацию ${flavour}Compile расширяющую основную конфигурацию compile (см. Таблицу 45.6 здесь для конфигураций на SourceSet, созданных java-плагином)
  3. Создайте JarTask (используя аромат в качестве классификатора)
  4. Публикуйте артефакт банды, чтобы на вкус можно было ссылаться через классификатор

Что-то вроде:

 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 } 

Затем, чтобы ссылаться на один из вариантов в другом проекте, вы можете выполнить одно из следующих действий:

 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' } 

Я написал плагин gradle-java-flavors, чтобы сделать это:

  • Проект github
  • JavaFlavoursPlugin.groovy
  • JavaFlavoursPluginTest.groovy