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

147

Lors du passage d'un paramètre -D en Java, quelle est la bonne façon d'écrire la ligne de commande puis 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?

Ryan Berger
la source
envisagez d'utiliser compareToIgnoreCaseau lieu de equalsIgnoreCasepour les identifiants indépendants des paramètres régionaux; Sinon, vous risquez de rencontrer le problème turc des quatre est, entre autres.
McDowell
4
Puis-je suggérer d'utiliser Boolean.getBoolean au lieu de la longue instruction if que vous avez? shankh.com/2009/07/07/some-fun-with-boolean-getboolean
marque
Que signifie -D?
Anshul

Réponses:

248

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

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

Depuis l'aide de la ligne de commande:

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

En d'autres termes, la façon dont vous l'avez actuellement sera traitée -Dtest="true"comme l'un des arguments à passer au mainlieu d'un argument JVM.

(Vous devriez probablement aussi laisser tomber les guillemets, mais cela peut bien fonctionner de toute façon - cela dépend probablement de votre shell.)

Jon Skeet
la source
14
Fonctionne parfaitement maintenant. Il est également intéressant de noter que pour reproduire ce comportement dans le débogueur Eclipse, ces types de paramètres doivent être placés dans la section Arguments VM sous Configurations d'exécution.
Ryan Berger
Au moins à partir de bash, cela fonctionne avec les guillemets (et autorise également les espaces de cette façon), je l'utilise toute la journée pour les appels de fourmis.
Paŭlo Ebermann
Sentez-vous un peu stupide sur le temps que j'ai passé sur celui-là! Merci d'avoir fait remarquer cela. :)
toidiu
4
au cas où quelqu'un se demanderait, si vous voulez passer plusieurs propriétés, utilisez simplement -D plusieurs fois après un 'espace' java -D <key1> = <valeur1> -D <key2> = <valeur2> -D <key3> = <valeur3 > ...
p_champ
48

Ça devrait être:

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

Ensuite, ce qui suit renverra la valeur:

System.getProperty("test");

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

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

Notez que la getBooleanméthode délègue la valeur de la propriété système, simplifiant le code à:

if( Boolean.getBoolean( "test" ) ) {
   // ...
}
Alain Pannetier
la source
1
dernier bit est également vrai pour: en Integer.getInteger("test"); Long.getLong("test")supposant que vous avez-Dtest=123
mt.uulu
23

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"))

pour éviter le NPE. Mais n'utilisez pas toujours les " conditions Yoda " 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")

est correct (fournissant la valeur par défaut true). Une possibilité plus courte est

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

mais ne pas utiliser la double négation ne rend pas les malentendus moins difficiles.

maaartinus
la source
1
En fait, ce System.getProperty("test", "true").equalsIgnoreCase("true")serait la meilleure façon d'écrire la dernière condition.
Paŭlo Ebermann
3
Boolean.getBoolean("test");est une autre option. Voir .
superfav
@Paulo Votre solution ne fonctionne que pour les propriétés (je voulais en montrer une générale) mais elle est plus agréable que la mienne.
maaartinus
1
Intéressant: dans cette réponse, le paramètre JVM vient après l'indicateur -jar, tandis que dans l'autre réponse, il vient après l' indicateur "java" mais avant l'indicateur -jar. Je suppose alors que leur clé est seulement que le paramètre JVM vient avant le fichier JAR lui-même, dans ce cas "myApplication.jar"?
Colm Bhandal
1
Bravo pour avoir prouvé le point sur la double négation d'une manière aussi évidente.
Silwing