Uso corretto dei parametri della riga di comando Java -D


147

Quando si passa un parametro -D in Java, qual è il modo corretto di scrivere la riga di comando e quindi accedervi dal codice?

Ad esempio, ho provato a scrivere qualcosa del genere ...

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

E poi chiamandolo così ...

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

Ma ricevo una NullPointerException. Che cosa sto facendo di sbagliato?


considerare l'utilizzo compareToIgnoreCaseinvece di equalsIgnoreCaseidentificatori agnostici locali; altrimenti potresti imbatterti nel problema turco del quattro-Is, tra gli altri.
— McDowell,

4
Posso suggerire di usare Boolean.getBoolean invece della lunga if-statement che hai? shankh.com/2009/07/07/some-fun-with-boolean-getboolean
— mark

Cosa significa -D?
— Anshul,

Risposte:


248

Ho il sospetto che il problema sia che hai inserito "-D" dopo il -jar. Prova questo:

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

Dalla guida della riga di comando:

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

In altre parole, il modo in cui lo hai in questo momento tratterà -Dtest="true"come uno degli argomenti da passare mainanziché come argomento JVM.

(Probabilmente dovresti anche eliminare le virgolette, ma potrebbe comunque funzionare bene - probabilmente dipende dalla tua shell.)


14
Funziona perfettamente ora. È anche interessante notare che per replicare questo comportamento all'interno del debugger Eclipse questi tipi di parametri devono essere inseriti nella sezione Argomenti VM in Esegui configurazioni.
— Ryan Berger,

Almeno da bash funziona con le virgolette (e consente anche gli spazi in questo modo), lo uso tutto il giorno per le chiamate ant.
— Paŭlo Ebermann,

Sentiti un po 'stupido per quanto tempo ho trascorso su quello! Grazie per la segnalazione. :)
— toidiu,

4
nel caso qualcuno si chieda, se si desidera passare più proprietà basta usare -D più volte dopo uno 'spazio' java -D <key1> = <value1> -D <key2> = <value2> -D <key3> = <value3 > ...
— p_champ,

48

Dovrebbe essere:

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

Quindi quanto segue restituirà il valore:

System.getProperty("test");

Il valore potrebbe essere null, tuttavia, quindi proteggiti da un'eccezione usando un Boolean:

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

Si noti che il getBooleanmetodo delega il valore della proprietà di sistema, semplificando il codice per:

if( Boolean.getBoolean( "test" ) ) {
   // ...
}

1
l'ultimo bit vale anche per: Integer.getInteger("test"); Long.getLong("test")supponendo che tu abbia-Dtest=123
— mt.uulu

23

Stai dando parametri al tuo programma invece a Java. Uso

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

anziché.

Prendi in considerazione l'utilizzo

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

per evitare l'NPE. Ma non usare " condizioni Yoda " sempre senza pensare, a volte lanciare l'NPE è il comportamento giusto e talvolta qualcosa di simile

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

è giusto (fornendo vero true). Una possibilità più breve è

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

ma non usare la doppia negazione non rende meno difficile fraintendere.


1
In realtà, System.getProperty("test", "true").equalsIgnoreCase("true")sarebbe il modo migliore per scrivere l'ultima condizione.
— Paŭlo Ebermann,

3
Boolean.getBoolean("test");è un'altra opzione. Vedere .
— Superfav,

@Paulo La tua soluzione funziona solo per proprietà (volevo mostrarne una generale) ma è più bella della mia.
— maaartinus,

1
Interessante: in questa risposta il parametro JVM viene dopo il flag -jar, mentre nell'altra risposta viene dopo il "java" ma prima del flag -jar. Prendo quindi che la loro chiave è solo che il parametro JVM viene prima del file JAR stesso, in questo caso "myApplication.jar"?
— Colm Bhandal,

1
Complimenti per dimostrare il punto sulla doppia negazione in un modo così ovvio.
— Silwing
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.