ether-config provee carga y binding de configuración desde múltiples fuentes (variables de entorno, propiedades del sistema, archivos JSON/TOML) sin frameworks externos.
Instalación
<dependency>
<groupId>dev.rafex.ether.config</groupId>
<artifactId>ether-config</artifactId>
<version>8.0.0-SNAPSHOT</version>
</dependency>
Cargar configuración
EtherConfig config = EtherConfig.of(
new EnvironmentConfigSource(),
new SystemPropertyConfigSource(),
new JsonFileConfigSource("config.json")
);
Optional<String> port = config.get("server.port");
String dbUrl = config.require("database.url");
Map<String, String> all = config.snapshot();
Binding a Records
Define tu configuración como Java Records:
@ConfigPrefix("server")
record ServerConfig(int port, String host) {}
@ConfigPrefix("database")
record DatabaseConfig(String url, String user, String password, int poolSize) {}
Binds automáticamente variables de entorno SERVER_PORT, SERVER_HOST, etc.:
ServerConfig server = config.bind(ServerConfig.class);
DatabaseConfig db = config.bind(DatabaseConfig.class);
System.out.println(server.port());
System.out.println(db.url());
Binding con validación
ServerConfig server = config.bindValidated(ServerConfig.class);
Alias de campos
record AppConfig(
@ConfigAlias("APP_SECRET_KEY") String secretKey,
@ConfigAlias("APP_ENV") String environment
) {}
Fuentes de configuración disponibles
| Clase | Descripción |
| EnvironmentConfigSource | Variables de entorno del sistema |
| SystemPropertyConfigSource | Propiedades -Dclave=valor de la JVM |
| JsonFileConfigSource | Archivo .json local |
| TomlFileConfigSource | Archivo .toml local |
| SecretConfigSource | Secretos externos (vault, etc.) |
Las fuentes se consultan en orden: la primera que tenga el valor gana.
Tipos soportados en binding
| Java type | Ejemplo de valor |
| String | "texto" |
| int / Integer | "8080" |
| long / Long | "1000000" |
| boolean / Boolean | "true" |
| double / Double | "3.14" |
| Duration | "PT30S", "30s" |
| URI | "https://api.example.com" |
| Enum | Nombre del valor |
Patrón 12-factor completo
public class AppContainer {
private final Lazy<EtherConfig> config = new Lazy<>(() ->
EtherConfig.of(new EnvironmentConfigSource()));
private final Lazy<ServerConfig> server = new Lazy<>(() ->
config.get().bind(ServerConfig.class));
private final Lazy<DatabaseConfig> db = new Lazy<>(() ->
config.get().bind(DatabaseConfig.class));
public ServerConfig serverConfig() { return server.get(); }
public DatabaseConfig databaseConfig() { return db.get(); }
}
# En producción
SERVER_PORT=8080 SERVER_HOST=0.0.0.0 DATABASE_URL=jdbc:postgresql://... java -jar app.jar
Más información