Java System.getProperty vs System.getenv

1. Introduction

Le package java.lang est automatiquement importé dans une application Java. Ce paquet contient de nombreuses classes couramment utilisées de NullPointerException à Object , Math et String .

La classe java.lang.System est une classe final , ce qui signifie que nous ne pouvons pas en créer une instance. Par conséquent, toutes les méthodes sont static .

Nous allons examiner les différences entre deux méthodes System pour lire les propriétés du système et les variables d’environnement.

Ces méthodes sont getProperty et getenv .

2. Utilisation de System.getProperty ()

La plate-forme Java utilise un objet Properties pour fournir des informations sur le système local et la configuration et nous les appelons Propriétés système .

Les propriétés système incluent des informations telles que l’utilisateur actuel, la version actuelle du moteur d’exécution Java et le séparateur de nom de chemin d’accès au fichier.

Dans le code ci-dessous, nous utilisons System.getProperty (“log dir”) pour lire la valeur de la propriété log dir . Nous utilisons également le paramètre default value. Ainsi, si la propriété n’existe pas, getProperty renvoie _/ tmp /log_ :

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

Pour mettre à jour les propriétés système à l’exécution, utilisez la méthode System.setProperty :

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

Nous pouvons transmettre nos propres propriétés ou valeurs de configuration à l’application en utilisant l’argument de ligne de commande propertyName au format suivant:

java -jar jarName -DpropertyName=value

Définition de la propriété de foo avec la valeur bar dans app.jar:

java -jar app -Dfoo = "barre"

  • System.getProperty retournera toujours un String . **

3. Utilisation de System.getenv ()

  • Les variables d’environnement sont des paires clé/valeur telles que Properties . ** De nombreux systèmes d’exploitation utilisent des variables d’environnement pour permettre la transmission d’informations de configuration aux applications.

La manière de définir une variable d’environnement diffère d’un système d’exploitation à un autre. Par exemple, sous Windows, nous utilisons une application Utilitaire système à partir du panneau de configuration, tandis qu’en Unix, nous utilisons des scripts shell.

  • Lors de la création d’un processus, il hérite par défaut d’un environnement de clonage de son processus parent. **

L’extrait de code suivant montre l’utilisation d’une expression lambda pour imprimer toutes les variables d’environnement.

System.getenv().forEach((k, v) -> {
    System.out.println(k + ":" + v);
});
  • getenv () renvoie un __Map. en lecture seule.

Pour obtenir une seule variable, appelez getenv avec le nom de la variable:

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

D’autre part, nous pouvons créer un autre processus à partir de notre application et ajouter de nouvelles variables à son environnement.

Pour créer un nouveau processus en Java, nous utilisons la classe ProcessBuilder qui a une méthode appelée environment . Cette méthode retourne un Map mais cette fois, la carte n’est pas en lecture seule, ce qui signifie que nous pouvons y ajouter des éléments:

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

4. Les différences

Bien qu’il s’agisse essentiellement de mappes fournissant des valeurs String pour les clés String , examinons quelques différences:

  1. Nous pouvons mettre à jour les propriétés au moment de l’exécution alors que les variables d’environnement sont une

copie immuable des variables du système d’exploitation.

  1. Les propriétés sont contenues uniquement dans la plate-forme Java alors que l’environnement

Les variables sont globales au niveau du système d’exploitation - disponibles pour toutes les applications exécutées sur le même ordinateur.

  1. Les propriétés doivent exister lors de la création de l’application, mais nous pouvons créer

Variables d’environnement sur le système d’exploitation à presque n’importe quel point.

5. Conclusion

Bien que conceptuellement similaire, l’application des propriétés et des variables d’environnement est très différente.

Le choix entre les options est souvent une question de portée. À l’aide des variables d’environnement, la même application peut être déployée sur plusieurs machines pour exécuter différentes instances et peut être configurée au niveau du système d’exploitation, voire dans des consoles AWS ou Azure. Suppression de la nécessité de reconstruire l’application pour mettre à jour config.

Rappelez-vous toujours que getProperty suit la convention de cas de chameau et que getenv ne le fait pas.