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?
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.)
Ç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" ) ) {
// ...
}
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.