การใช้ที่เหมาะสมของพารามิเตอร์บรรทัดคำสั่ง Java -D


147

เมื่อผ่านพารามิเตอร์ -D ใน Java วิธีที่เหมาะสมในการเขียนบรรทัดคำสั่งคืออะไรแล้วเข้าถึงจากโค้ด?

ตัวอย่างเช่นฉันได้ลองเขียนสิ่งนี้ ...

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

แล้วเรียกมันว่าสิ่งนี้ ...

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

แต่ฉันได้รับ NullPointerException ผมทำอะไรผิดหรือเปล่า?


พิจารณาใช้compareToIgnoreCaseแทนequalsIgnoreCaseตัวระบุสถานที่ - ผู้ไม่เชื่อเรื่องพระเจ้า ไม่เช่นนั้นคุณอาจเจอปัญหาสี่ข้อของตุรกีและอื่น ๆ
McDowell

4
ฉันขอแนะนำให้ใช้ Boolean.getBoolean แทนคำสั่ง if ที่ยาวที่คุณมีได้ไหม shankh.com/2009/07/07/some-fun-with-boolean-getboolean
ทำเครื่องหมาย

-D หมายถึงอะไร
Anshul

คำตอบ:


248

ฉันสงสัยว่าปัญหาที่เกิดขึ้นคือการที่คุณได้ใส่ "-D" หลังจาก -jarลองสิ่งนี้:

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

จากวิธีใช้บรรทัดคำสั่ง:

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

กล่าวอีกนัยหนึ่งวิธีที่คุณได้รับในขณะนี้จะถือว่า-Dtest="true"เป็นหนึ่งในข้อโต้แย้งที่จะส่งผ่านไปmainแทนที่จะเป็นอาร์กิวเมนต์ JVM

(คุณอาจจะยังลดลงคำพูด แต่มันอาจทำงานต่อไป -. มันอาจจะขึ้นอยู่กับเปลือกของคุณ)


14
ทำงานได้อย่างสมบูรณ์แบบในขณะนี้ สิ่งที่น่าสนใจที่ควรทราบก็คือเพื่อที่จะทำซ้ำพฤติกรรมนี้ภายใน Eclipse ดีบักเกอร์พารามิเตอร์ประเภทนี้จะต้องอยู่ในส่วน VM อาร์กิวเมนต์ภายใต้เรียกใช้การกำหนดค่า
Ryan Berger

อย่างน้อยจากการทุบตีมันทำงานกับคำพูดที่นั่น (และยังช่วยให้ช่องว่างด้วยวิธีนี้) ฉันใช้มันตลอดทั้งวันสำหรับการโทรมด
Paŭlo Ebermann

รู้สึกงี่เง่าว่าฉันใช้เวลาไปเท่าไหร่! ขอบคุณสำหรับการชี้ให้เห็นว่า :)
toidiu

4
ในกรณีที่มีคนสงสัยว่าถ้าคุณต้องการผ่านคุณสมบัติหลายอย่างเพียงใช้ -D หลายครั้งหลังจากที่ 'space' java -D <key1> = <value1> -D <key2> = <value2> -D <key3> = <value3 > ...
p_champ

48

นั่นควรจะเป็น:

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

จากนั้นต่อไปนี้จะคืนค่า:

System.getProperty("test");

แม้ว่าค่าอาจเป็นnullเช่นนั้นดังนั้นโปรดป้องกันข้อยกเว้นในการใช้Boolean:

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

โปรดทราบว่าgetBooleanวิธีการมอบหมายค่าคุณสมบัติของระบบทำให้รหัสง่ายขึ้นเพื่อ:

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

1
บิตสุดท้ายก็เป็นจริงเช่นกัน: Integer.getInteger("test"); Long.getLong("test")สมมติว่าคุณมี-Dtest=123
mt.uulu

23

คุณกำลังกำหนดพารามิเตอร์ให้กับโปรแกรมของคุณแทน Java ใช้

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

แทน.

พิจารณาใช้

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

เพื่อหลีกเลี่ยง NPE แต่อย่าใช้ " เงื่อนไขของโยดา " เสมอโดยไม่ต้องคิดบางครั้งการขว้าง NPE นั้นเป็นพฤติกรรมที่ถูกต้องและบางครั้งก็เป็นเช่นนั้น

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

ถูกต้อง (ให้ค่าเริ่มต้นเป็นจริง) ความเป็นไปได้ที่สั้นลงคือ

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

แต่การไม่ใช้การปฏิเสธคู่ไม่ทำให้เข้าใจผิดน้อยลง


1
ที่จริงแล้วSystem.getProperty("test", "true").equalsIgnoreCase("true")จะเป็นวิธีที่ดีกว่าในการเขียนเงื่อนไขสุดท้าย
Paŭlo Ebermann

3
Boolean.getBoolean("test");เป็นอีกทางเลือกหนึ่ง ดู
superfav

@Paulo โซลูชันของคุณใช้ได้กับคุณสมบัติเท่านั้น (ฉันต้องการแสดงแบบทั่วไป) แต่ดีกว่าของฉัน
maaartinus

1
สิ่งที่น่าสนใจ: ในคำตอบนี้พารามิเตอร์ JVM จะอยู่หลังแฟล็ก -jar ในขณะที่คำตอบอื่น ๆ นั้นจะอยู่หลัง "java" แต่อยู่หน้าแฟล็ก -jar ฉันเอามันไปแล้วว่าพวกเขาสำคัญเพียงว่าพารามิเตอร์ JVM มาก่อนไฟล์ JAR เองในกรณีนี้ "myApplication.jar"?
Colm Bhandal

1
ยกนิ้วให้พิสูจน์จุดเกี่ยวกับการปฏิเสธคู่ในลักษณะที่ชัดเจน
Silwing
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.