🔧 Cómo leer variables de Gradle en Java: 3 formas prácticas

Carlos ExpositoCarlos Exposito
2 min read

A veces necesitamos que Java conozca datos definidos en el build.gradle (como una versión, un ID o una URL). Pero replicarlos en código Java no es elegante ni mantenible.
Aquí te muestro 3 formas de leer variables de Gradle directamente en Java, con ejemplos sencillos y distintos a los típicos.


✨ 1. Generar una clase Java automáticamente

Primero definimos una variable en build.gradle:

ext {
    apiBaseUrl = 'https://api.misitio.dev'
}

Creamos un directorio para código generado y lo incluimos en los sourceSets:

def generatedDir = "$buildDir/generated-code"

sourceSets {
    main {
        java {
            srcDirs += generatedDir
        }
    }
}

Luego agregamos una tarea que genere una clase ApiConfig:

tasks.register('generateApiConfig') {
    doLast {
        def output = file("$generatedDir/com/ejemplo/config")
        output.mkdirs()
        def archivo = new File(output, "ApiConfig.java")
        archivo.text = """
            package com.ejemplo.config;

            public final class ApiConfig {
                public static final String API_URL = "${apiBaseUrl}";
                private ApiConfig() {}
            }
        """.stripIndent()
    }
}

💡 Agrega esta tarea como dependencia del compilado:

compileJava.dependsOn generateApiConfig

Y úsalo en Java como:

assertEquals("https://api.misitio.dev", ApiConfig.API_URL);

📄 2. Crear un archivo de propiedades

Otro enfoque: generar un .properties con la variable.

def resourcesDir = "$buildDir/generated-res"

sourceSets {
    main {
        resources {
            srcDirs += resourcesDir
        }
    }
}

Tarea para crear el archivo:

tasks.register('generateApiProperties') {
    doLast {
        def dir = file("$resourcesDir/main")
        dir.mkdirs()
        new File(dir, "api.properties").text = "API_URL=${apiBaseUrl}"
    }
}

Y lo leemos así:

Properties props = new Properties();
props.load(getClass().getClassLoader().getResourceAsStream("api.properties"));
String url = props.getProperty("API_URL");
assertEquals("https://api.misitio.dev", url);

No olvides:

compileJava.dependsOn generateApiProperties

🌍 3. Inyectar como variable del sistema o del entorno

¿Solo lo necesitas en pruebas o ejecución? Usa inyección:

test {
    systemProperty "API_URL", "${apiBaseUrl}"
    environment "API_URL", "${apiBaseUrl}"
}

Y desde Java:

System.out.println(System.getProperty("API_URL"));
System.out.println(System.getenv("API_URL"));

Ideal si usas bootRun, test, o scripts personalizados.


🧠 ¿Cuál elegir?

MétodoProsContras
Clase Java generadaTipado, autocompletado, seguridadMenos dinámico
Archivo .propertiesCompatible, versátilNecesitas leer el archivo
Variables del sistemaMuy simple, ideal para testingNo detectado en compilación

✅ Conclusión

No hay una única forma correcta. Cada técnica brilla en su contexto.
Elige el método que mejor se adapte a tu flujo y automatiza esa variable para siempre 😎

0
Subscribe to my newsletter

Read articles from Carlos Exposito directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Carlos Exposito
Carlos Exposito