Я хотел бы сгенерировать класс 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
.
Цените любые идеи (даже если они находятся на другом треке).