Java -D komut satırı parametrelerinin doğru kullanımı


151

Java'da bir -D parametresi geçirirken, komut satırını yazmanın ve sonra ona koddan erişmenin doğru yolu nedir?

Mesela böyle bir şey yazmayı denedim ...

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

Ve sonra böyle adlandırmak ...

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

Ancak bir NullPointerException alıyorum. Neyi yanlış yapıyorum?


yerel agnostik tanımlayıcılar compareToIgnoreCaseyerine kullanmayı düşünün equalsIgnoreCase; aksi takdirde, diğerlerinin yanı sıra Türk dördü-İş sorunuyla karşılaşabilirsiniz.
McDowell

4
Sahip olduğunuz uzun if-ifadesi yerine Boolean.getBoolean'ı kullanmanızı önerebilir miyim? shankh.com/2009/07/07/some-fun-with-boolean-getboolean
işaretleyin

-D ne anlama geliyor?
Anshul

Yanıtlar:


253

Sorunun "put -D" ettik şüpheli sonra-jar . Bunu dene:

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

Komut satırından yardım:

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

Başka bir deyişle, şu anda sahip olduğunuz yöntem , bir JVM argümanı yerine -Dtest="true"geçilecek argümanlardan mainbiri olarak değerlendirilecektir.

(Muhtemelen alıntıları da bırakmalısınız, ancak yine de işe yarayabilir - muhtemelen kabuğunuza bağlıdır.)


15
Şimdi mükemmel çalışıyor. Ayrıca, bu davranışı Eclipse hata ayıklayıcı içinde çoğaltmak için bu tür parametrelerin Çalıştırma Yapılandırmaları altındaki VM Bağımsız Değişkenleri bölümüne yerleştirilmesi gerektiğidir.
Ryan Berger

Dan en az bash o tırnak vardır (ve ayrıca alanlarda bu şekilde sağlar), bunu her gün kullanılan karınca aramalar için birlikte çalışır.
Paŭlo Ebermann

Bunun için ne kadar zaman harcadığım konusunda kendimi aptal gibi hissediyorum! Bunu belirttiğiniz için teşekkürler. :)
toidiu

4
Birinin merak etmesi durumunda, birden fazla özelliği geçirmek istiyorsanız, sadece bir 'boşluk'tan sonra -D birden çok kez kullanın java -D <key1> = <value1> -D <key2> = <value2> -D <key3> = <value3 > ...
p_champ

49

O olmalı:

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

Ardından aşağıdaki değer değeri döndürecektir:

System.getProperty("test");

Değer yine de olabilir null, bu nedenle a kullanarak bir istisnaya karşı dikkatli olun Boolean:

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

Not bu getBooleanyöntem delege sistemi özellik değeri, kodu basitleştirilmesi:

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

1
Geçen bit de için de geçerlidir: Integer.getInteger("test"); Long.getLong("test")Eğer varsa varsayarak-Dtest=123
mt.uulu

24

Java yerine programınıza parametreler veriyorsunuz. Kullanım

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

yerine.

Kullanmayı düşünün

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

NPE'den kaçınmak için. Ancak " Yoda koşullarını " her zaman düşünmeden kullanmayın, bazen NPE'yi fırlatmak doğru davranış ve bazen

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

doğrudur (varsayılan true sağlanır). Daha kısa bir olasılık

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

ancak çifte olumsuzlamayı kullanmamak, yanlış anlamayı daha az zorlaştırmaz.


1
Aslında, System.getProperty("test", "true").equalsIgnoreCase("true")son durumu yazmanın daha iyi bir yolu olurdu.
Paŭlo Ebermann

3
Boolean.getBoolean("test");başka bir seçenektir. Bakın .
superfav

@Paulo Sizin çözümünüz yalnızca mülkler için işe yarıyor (genel bir çözüm göstermek istedim) ama benimkinden daha güzel.
maaartinus

1
İlginç: Bu cevapta JVM parametresi -jar bayrağından sonra , diğer cevapta ise "java" dan sonra , -jar bayrağından önce gelir . Öyleyse, anahtarın sadece JVM parametresinin JAR dosyasından önce geldiğini anlıyorum, bu durumda "myApplication.jar"?
Colm Bhandal

1
Çifte olumsuzlama hakkındaki noktayı bu kadar açık bir şekilde kanıtladığınız için parmaklarınızı kaldırın.
Silwing
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.