Genera una clase Java usando el plugin Gradle para Java
Me gustaría generar una clase Java usando una tarea de Gradle para unaJava proyecto, similar a cómo crea el plugin de AndroidBuildConfig.java
utilizando labuildConfig <String>
notación, por ejemplo:
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
}
}
}
El caso de uso es que estoy desarrollando una aplicación de código abierto que requiere el uso de una clave API y un secreto; Tengo la llave y el secreto engradle.properties
que no está comprometido con mi VCS.
Hasta ahora, tengo esto:
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
y funciona: genera ese archivo en la ubicación especificada. Pero es muy frágil; nombrar explícitamente el paquete es propenso a error. Me alegraría que el archivo se genere en algún otro paquete (por ejemplo, en la raíz delsrc/main/java
) Mientras pueda acceder a ella en Java, usandoMyGeneratedFile.MyConstant
.
Aprecie cualquier idea (incluso si están en un camino diferente).