Java System.getProperty et System.getenv

1. Introduction

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

La classe java.lang.System est une classe finale , ce qui signifie que nous ne pouvons pas la sous-classer, donc toutes les méthodes sont statiques .

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

Ces méthodes sont getProperty et getenv .

2. Utilisation de System.getProperty ()

La plateforme Java utilise un objet Properties pour fournir des informations sur le système local et la configuration et nous l'appelons System Properties .

Les propriétés système incluent des informations telles que l'utilisateur actuel, la version actuelle de l'environnement d'exécution Java et le séparateur de nom de chemin de 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 de valeur par défaut, donc 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 au moment de 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 à l'aide de l' argument de ligne de commande propertyName au format:

java -jar jarName -DpropertyName=value

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

java -jar app -Dfoo="bar"

System.getProperty renverra toujours une chaîne .

3. Utilisation de System.getenv ()

Les variables d'environnement sont des paires clé / valeur comme Properties. De nombreux systèmes d'exploitation utilisent des variables d'environnement pour permettre aux informations de configuration d'être transmises aux applications.

La manière de définir une variable d'environnement diffère d'un système d'exploitation à l'autre. Par exemple, sous Windows, nous utilisons une application Utilitaire système à partir du panneau de contrôle tandis que sous Unix nous utilisons des scripts shell.

Lors de la création d'un processus, il hérite par défaut d'un environnement clone 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 une Map en lecture seule . Essayer d'ajouter des valeurs à la carte lève une exception UnsupportedOperationException .

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 environnement . Cette méthode renvoie une carte 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 env = pb.environment(); env.put("log_dir", "/tmp/log"); Process process = pb.start();

4. Les différences

Bien que les deux soient essentiellement des cartes qui fournissent 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 tandis que les variables d'environnement sont une copie immuable des variables du système d'exploitation.
  2. Les propriétés sont contenues uniquement dans la plate-forme Java tandis que les variables d'environnement sont globales au niveau du système d'exploitation - disponibles pour toutes les applications exécutées sur la même machine.
  3. Les propriétés doivent exister lors de l'empaquetage de l'application, mais nous pouvons créer des variables d'environnement sur le système d'exploitation à presque tout moment.

5. Conclusion

Bien que conceptuellement similaire, l'application des propriétés et des variables d'environnement est assez 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 ou même dans les consoles AWS ou Azure. Suppression de la nécessité de reconstruire l'application pour mettre à jour la configuration.

Rappelez-vous toujours que getProperty suit la convention camel-case et que getenv ne le fait pas.