Подтвердить что ты не робот

Создание класса Java с помощью Gradle для плагина Java

Я хотел бы сгенерировать класс Java с помощью задачи Gradle для проекта Java, аналогично тому, как плагин Android создает BuildConfig.java с использованием нотации buildConfig <String>, например:

android {
    ...

    buildTypes {
        final String PROVIDER_AUTHORITY_RELEASE = "public static final String PROVIDER_AUTHORITY = \"com.example.project.ContentProvider\";\n";
        final String PROVIDER_AUTHORITY_DEBUG = "public static final String PROVIDER_AUTHORITY = \"com.example.project.debug.ContentProvider\";\n";

        debug {
            ...
            buildConfig PROVIDER_AUTHORITY_DEBUG
        }

        release {
            ...
            buildConfig PROVIDER_AUTHORITY_RELEASE
        }
    }
}

Вариант использования заключается в том, что я разрабатываю приложение с открытым исходным кодом, которое требует использования ключа API и его секрет; У меня есть ключ и секрет в gradle.properties, который не привязан к моему VCS.

Пока у меня есть это:

task generateSources {
    outputDir = file("$buildDir/../src/main/java/uk/co/ataulm/mijur/core/api")
    outputs.dir outputDir
    doFirst {
        outputDir.exists() || outputDir.mkdirs()

        String API_CLIENT_ID = "public static final String API_CLIENT_ID = \"<your imgur uk.co.ataulm.mijur.core.api client id>\";\n"
        String API_CLIENT_SECRET = "public static final String API_CLIENT_SECRET = \"<your imgur uk.co.ataulm.mijur.core.api client secret>\";\n"

        try {
            API_CLIENT_ID = "public static final String API_CLIENT_ID = \"" + apiClientId + "\";\n"
            API_CLIENT_SECRET = "public static final String API_CLIENT_SECRET = \"" + apiClientSecret + "\";\n"
        } catch (Exception e) {
            println "gradle.properties not set with apiClientId and/or apiClientSecret. API calls will not work.";
        }

        new File(outputDir, "ApiConstants.java").write("package uk.co.ataulm.mijur.core.api;\n\npublic class ApiConstants {\n" + "    " + API_CLIENT_ID + "    " + API_CLIENT_SECRET + "}")
    }
}

compileJava.source generateSources.outputs.files, sourceSets.main.java

и он работает - он создает этот файл в указанном месте. Но он очень хрупкий; явно называя пакет, подвержен ошибкам. Я был бы рад, если файл сгенерирован в другом пакете (например, в корневом каталоге src/main/java), если я могу получить к нему доступ в Java, используя MyGeneratedFile.MyConstant.

Цените любые идеи (даже если они находятся на другом треке).

4b9b3361

Ответ 1

Более элегантный подход - написать плагин Gradle.

task javaSourceGen(type: com.somecompany.gensrc.GenerateSouce) {
  //pass appropriate parameters
}
compileJava.dependsOn(javaSourceGen)

Затем в плагине Gradle можно использовать любой проект генератора Java-источников.

Например: https://github.com/square/javapoet или  http://codemodel.java.net/

Ответ 2

Я написал плагин gradle, который призван предоставить конфигурацию сборки, подобную той, которая установлена ​​с помощью плагина gradle для разработки приложений для Android java/groovy:

https://github.com/mfuerstenau/gradle-buildconfig-plugin

Это на источник, потому что мне нужна определенная версия для отображения для разных артефактов, основанных на двух разных наборах источников.

просто примените плагин (gradle 2.1 +)

plugins {
    'de.fuerstenau.buildconfig'
}

buildConfig {
   sourceSets {
      // this is a build config for "main" source set
      main {
         // if not defined, these are the defaults
         // packageName = project.group (not specified -> de.fuerstenau.buildconfig)
         // appName = project.name
         // version = project.version

         // custom fields con also be added
         // for example:
         // buildConfigField "String" "MYSTRING" "value"
      }
      // add more or other sourceSets like "main", be aware
      // of conflicts if you use
      // them combined
   }
}

приведет к классу de.fuerstenau.buildconfig.BuildConfig (пакет можно настроить, как указано выше):

package de.fuerstenau.buildconfig;

public final class BuildConfig
{
   private BuildConfig { }
   public final String VERSION = "<whatever-version-was-configured>";
   public final String NAME = "<whatever-appName-was-configured>";
}

Создаются и добавляются две задачи: одна для генерации класса, другая для ее компиляции, они выполняются до "compileJava" -task, и результат добавляется как зависимость.