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.