Java System.getProperty frente a System.getenv

1. Introducción

El paquete java.lang se importa automáticamente cuando se encuentra en una aplicación Java. Este paquete contiene muchas clases de uso común, desde NullPointerException hasta Object , Math y String .

La clase java.lang.System es una clase final , lo que significa que no podemos subclasificarla, por lo tanto, todos los métodos son estáticos .

Vamos a ver las diferencias entre dos métodos del sistema para leer las propiedades del sistema y las variables de entorno.

Estos métodos son getProperty y getenv .

2. Usando System.getProperty ()

La plataforma Java utiliza un objeto Propiedades para proporcionar información sobre el sistema local y la configuración y lo llamamos Propiedades del sistema .

Las propiedades del sistema incluyen información como el usuario actual, la versión actual del tiempo de ejecución de Java y el separador de nombre de ruta de archivo.

En el siguiente código, usamos System.getProperty ("log_dir") para leer el valor de la propiedad log_dir . También utilizamos el parámetro de valor predeterminado, por lo que si la propiedad no existe, getProperty devuelve / tmp / log :

String log_dir = System.getProperty("log_dir","/tmp/log"); 

Para actualizar las propiedades del sistema en tiempo de ejecución, utilice el método System.setProperty :

System.setProperty("log_dir", "/tmp/log");

Podemos pasar nuestras propias propiedades o valores de configuración a la aplicación usando el argumento de línea de comando propertyName en el formato:

java -jar jarName -DpropertyName=value

Estableciendo la propiedad de foo con un valor de bar en app.jar:

java -jar app -Dfoo="bar"

System.getProperty siempre devolverá una cadena .

3. Usando System.getenv ()

Las variables de entorno son pares clave / valor como Propiedades. Muchos sistemas operativos utilizan variables de entorno para permitir que la información de configuración se pase a las aplicaciones.

La forma de establecer una variable de entorno difiere de un sistema operativo a otro. Por ejemplo, en Windows, usamos una aplicación de Utilidad del sistema desde el panel de control, mientras que en Unix usamos scripts de shell.

Al crear un proceso, por defecto hereda un entorno de clonación de su proceso padre.

El siguiente fragmento de código muestra el uso de una expresión lambda para imprimir todas las variables de entorno.

System.getenv().forEach((k, v) -> { System.out.println(k + ":" + v); }); 

getenv () devuelve un mapa de solo lectura . Intentar agregar valores al mapa arroja una UnsupportedOperationException .

Para obtener una sola variable, llame a getenv con el nombre de la variable:

String log_dir = System.getenv("log_dir");

Por otro lado, podemos crear otro proceso desde nuestra aplicación y agregar nuevas variables a su entorno.

Para crear un nuevo proceso en Java, usamos la clase ProcessBuilder que tiene un método llamado entorno . Este método devuelve un mapa, pero esta vez el mapa no es de solo lectura, lo que significa que podemos agregarle elementos:

ProcessBuilder pb = new ProcessBuilder(args); Map env = pb.environment(); env.put("log_dir", "/tmp/log"); Process process = pb.start();

4. Las diferencias

Aunque ambos son esencialmente mapas que proporcionan Cuerda valores para Cuerda llaves, vamos a ver algunas diferencias:

  1. Podemos actualizar las propiedades en tiempo de ejecución, mientras que las variables de entorno son una copia inmutable de las variables del sistema operativo.
  2. Las propiedades están contenidas solo dentro de la plataforma Java, mientras que las variables de entorno son globales en el nivel del sistema operativo, disponibles para todas las aplicaciones que se ejecutan en la misma máquina.
  3. Las propiedades deben existir al empaquetar la aplicación, pero podemos crear variables de entorno en el sistema operativo en casi cualquier punto.

5. Conclusión

Aunque conceptualmente similar, la aplicación de propiedades y variables de entorno es bastante diferente.

La elección entre las opciones suele ser una cuestión de alcance. Con las variables de entorno, la misma aplicación se puede implementar en varias máquinas para ejecutar diferentes instancias y se puede configurar en el nivel del sistema operativo o incluso en las consolas de AWS o Azure. Eliminando la necesidad de reconstruir la aplicación para actualizar config.

Recuerde siempre que getProperty sigue la convención de camel-case y getenv no.