web-dev-qa-db-fra.com

Utilisation correcte des paramètres de ligne de commande Java -D

Lorsque vous passez un paramètre -D en Java, quelle est la bonne façon d'écrire la ligne de commande et d'y accéder à partir du code?

Par exemple, j'ai essayé d'écrire quelque chose comme ça ...

if (System.getProperty("test").equalsIgnoreCase("true"))
{
   //Do something
}

Et puis l'appelant comme ça ...

Java -jar myApplication.jar -Dtest="true"

Mais je reçois une NullPointerException. Qu'est-ce que je fais mal?

138
Ryan Berger

Je soupçonne que le problème est que vous avez mis le "-D" après le -jar. Essaye ça:

Java -Dtest="true" -jar myApplication.jar

Depuis l'aide en ligne de commande:

Java [-options] -jar jarfile [args...]

En d’autres termes, votre version actuelle traitera -Dtest="true" comme l’un des arguments à transmettre à main au lieu d’un argument JVM.

(Vous devriez probablement aussi supprimer les guillemets, mais cela pourrait fonctionner de toute façon - cela dépend probablement de votre Shell.)

230
Jon Skeet

Ça devrait être:

Java -Dtest="true" -jar myApplication.jar

Ensuite, les éléments suivants renverront la valeur:

System.getProperty("test");

La valeur peut être null, cependant, alors protégez-vous contre une exception utilisant un Boolean:

boolean b = Boolean.parseBoolean( System.getProperty( "test" ) );

Notez que la méthode getBoolean délègue la valeur de la propriété système, ce qui simplifie le code en:

if( Boolean.getBoolean( "test" ) ) {
   // ...
}
38
Alain Pannetier

Vous donnez des paramètres à votre programme à la place de Java. Utilisation

Java -Dtest="true" -jar myApplication.jar 

au lieu.

Pensez à utiliser

"true".equalsIgnoreCase(System.getProperty("test"))

éviter les NPE. Mais n'utilisez pas "conditions de Yoda" toujours sans réfléchir, parfois lancer le NPE est le bon comportement et parfois quelque chose comme

System.getProperty("test") == null || System.getProperty("test").equalsIgnoreCase("true")

a raison (en fournissant true par défaut). Une possibilité plus courte est

!"false".equalsIgnoreCase(System.getProperty("test"))

mais ne pas utiliser la double négation ne rend pas moins difficile de se méprendre.

22
maaartinus