Generieren Sie eine Java-Klasse mit dem Gradle for Java-Plugin

Ich möchte eine Java-Klasse mit einer Gradle-Aufgabe für a generierenJava Projekt, ähnlich wie das Android-Plugin erstelltBuildConfig.java Verwendung derbuildConfig <String> Notation, z.B.

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

Der Anwendungsfall ist, dass ich eine Open-Source-App entwickle, die die Verwendung eines API-Schlüssels und eines Geheimnisses erfordert. Ich habe den Schlüssel und das Geheimnis ingradle.properties das ist nicht zu meinem VCS verpflichtet.

Bisher habe ich Folgendes:

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

und es funktioniert - es erzeugt diese Datei am angegebenen Ort. Aber es ist sehr zerbrechlich. Die explizite Benennung des Pakets ist fehleranfällig. Ich würde mich freuen, wenn die Datei in einem anderen Paket generiert wird (z. B. im Stammverzeichnis dersrc/main/java), solange ich mit Java darauf zugreifen kannMyGeneratedFile.MyConstant.

Schätzen Sie alle Ideen (auch wenn sie auf einem anderen Weg sind).

Antworten auf die Frage(2)

Ihre Antwort auf die Frage