ฉันจะรับค่าตัวแปรระบบใน Java ได้อย่างไร


169

ฉันจะรับค่าตัวแปรระบบที่มีอยู่ได้อย่างไร

MyComputer -> Properties -> Advanced -> Environment Variables -> System Variables

ใน Java?

แก้ไข

ฉันได้ใช้System.getenv()วิธีการ

มันคือค่าการพิมพ์ถ้าฉันให้

System.out.println(System.getenv("JAVA_HOME"));

และมันก็แสดงnullค่าถ้าฉันลองเหมือนกันสำหรับตัวแปรระบบที่สร้างขึ้นโดยฉัน

System.out.println(System.getenv("DBE"));

5
คุณสามารถลองเริ่มกระบวนการร้องขอ (NetBeans ในกรณีของฉัน)
Kotodid

3
ฉันสังเกตว่าตัวเลือกการเริ่มต้นใหม่จาก eclipse ไม่ทำงาน เพียงปิดแอปพลิเคชั่นแล้วเริ่มใหม่อีกครั้ง
Yasin

1
การเริ่มต้น IntelliJ ใหม่ช่วยแก้ปัญหาของฉันได้
ภูชันคาร์มาร์การ์

การรีสตาร์ทระบบใช้งานได้สำหรับฉันอาจเป็น JVM จะเก็บแคชของค่าไว้ตั้งแต่เริ่มแรกเนื่องจากไม่มีการตรวจพบตัวแปรใหม่
sumitkanoje

คำตอบ:



52

ในการชี้แจงตัวแปรระบบเหมือนกับตัวแปรสภาพแวดล้อม ตัวแปรสภาพแวดล้อมของผู้ใช้ถูกตั้งค่าต่อผู้ใช้และแตกต่างกันเมื่อใดก็ตามที่ผู้ใช้ที่แตกต่างกันเข้าสู่ระบบตัวแปรสภาพแวดล้อมทั้งระบบจะเหมือนกันไม่ว่าผู้ใช้จะเข้าสู่ระบบใด

หากต้องการเข้าถึงค่าปัจจุบันของตัวแปรทั้งระบบหรือตัวแปรผู้ใช้ใน Java โปรดดูด้านล่าง:

String javaHome = System.getenv("JAVA_HOME");

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับตัวแปรสภาพแวดล้อมที่เห็นนี้หน้าวิกิพีเดีย

ตรวจสอบให้แน่ใจว่าตัวแปรสภาพแวดล้อมที่คุณพยายามอ่านนั้นถูกตั้งค่าอย่างเหมาะสมก่อนที่จะเรียกใช้ Java โดยทำ:

echo %MYENVVAR%

คุณควรเห็นค่าของตัวแปรสภาพแวดล้อม ถ้าไม่คุณอาจต้องเปิดเชลล์ (DOS) อีกครั้งหรือออกจากระบบและเข้าสู่ระบบอีกครั้ง


สวัสดี .. ฉันใช้วิธีการ System.getenv () .. ค่าการพิมพ์ถ้าฉันให้ "System.out.println (System.getenv (" JAVA_HOME "));" และแสดงค่า Null ถ้าฉันให้ตัวแปรระบบที่สร้างโดยฉัน ("System.out.println (System.getenv (" DBE "));"
raja

3
getenvควรเป็นกรณีเล็ก ๆ แทนgetEnvใช่มั้ย
Pratik Khadloya

1
ถ้าฉันทำมันพิมพ์echo %var% %var%ถ้าฉันลองแทนecho $varมันใช้งานได้และแสดงค่าของตัวแปร env นั้น ฉันgetenvกำลังกลับมาเป็นโมฆะ
dialex

3
@dialex %var%ใช้สำหรับ windows $varสำหรับระบบ unix / linux / MacOS
Al-Mothafar

27

มีรายละเอียดที่น่าสนใจเล็กน้อยเมื่อรับคุณสมบัติระบบ / สภาพแวดล้อม

ครั้งแรกSystem.getenv(String)ได้รับการแนะนำวิธีการกลับเมื่อแล้วเลิก เลิก (เขลา IHMO) อย่างต่อเนื่องทุกทางเข้า JSE 1.4

มันได้รับการแนะนำใน JSE 5อีกครั้ง

สิ่งเหล่านี้ถูกตั้งค่าโดยใช้พาเนล Environment Variables ใน Windows การเปลี่ยนแปลงตัวแปรอาจไม่ได้รับจนกว่า VM ปัจจุบันของคุณจะปิดและอินสแตนซ์ CMD.exe ถูกออก

ในทางตรงกันข้ามกับคุณสมบัติสิ่งแวดล้อม, Java นอกจากนี้ยังมีคุณสมบัติของระบบ Java System.getProperties()ผ่านเข้าถึง ตัวแปรเหล่านี้สามารถเริ่มต้นได้เมื่อ VM เริ่มทำงานโดยใช้อาร์กิวเมนต์บรรทัดคำสั่งชุด ตัวอย่างเช่นค่าสำหรับคุณสมบัติและตั้งค่าในคำสั่งด้านล่าง:-Dname=valuemaxInMemorypagingDirectory

C: \> java.exe -DmaxInMemory = 100M -DpagingDirectory = c: \ temp -jar myApp.jar

คุณสมบัติเหล่านี้สามารถแก้ไขได้ที่รันไทม์ซึ่งมีข้อ จำกัด นโยบายความปลอดภัย


19

จริงๆแล้วตัวแปรสามารถตั้งค่าได้หรือไม่ดังนั้นใน Java 8 หรือสูงกว่าค่า nullable ควรถูกห่อเป็นOptionalวัตถุซึ่งช่วยให้คุณสมบัติที่ดีจริงๆ ในตัวอย่างต่อไปนี้เราจะพยายามรับตัวแปรENV_VAR1ถ้ามันไม่มีอยู่เราอาจโยนข้อยกเว้นที่กำหนดเองเพื่อแจ้งเตือนเกี่ยวกับมัน:

String ENV_VAR1 = Optional.ofNullable(System.getenv("ENV_VAR1")).orElseThrow(
  () -> new CustomException("ENV_VAR1 is not set in the environment"));

5

Google บอกว่าจะตรวจสอบgetenv () :

ส่งคืนมุมมองแผนที่สตริงที่ไม่สามารถเปลี่ยนแปลงได้ของสภาพแวดล้อมระบบปัจจุบัน

ฉันไม่แน่ใจว่าตัวแปรของระบบแตกต่างจากตัวแปรสภาพแวดล้อมอย่างไรดังนั้นหากคุณสามารถชี้แจงได้ฉันสามารถช่วยได้มากขึ้น


ฉันคิดว่า raja หมายถึง "ทั้งระบบ" ซึ่งตรงข้ามกับตัวแปรสภาพแวดล้อม "ต่อผู้ใช้"
Rob

3

คุณลองรีบูตเครื่องแล้วตั้งแต่ตั้งค่าตัวแปรสภาพแวดล้อม

ปรากฏว่า Windows เก็บตัวแปรสภาพแวดล้อมในแคชบางประเภทและการรีบูตเครื่องเป็นวิธีหนึ่งในการรีเฟรช ฉันไม่แน่ใจ แต่อาจมีวิธีอื่น แต่ถ้าคุณไม่เปลี่ยนค่าตัวแปรบ่อยเกินไปสิ่งนี้อาจดีพอ


3

ดังที่ได้รับการกล่าวถึงจากข้างบนการรีสตาร์ทคราสทำงานให้ฉันสำหรับตัวแปรสภาพแวดล้อมที่ผู้ใช้กำหนด หลังจากที่ฉันรีสตาร์ท eclipse IDE System.getenv()จะรับค่าตัวแปรสภาพแวดล้อมของฉัน


0

คุณใช้ระบบ linux หรือไม่? ถ้าเป็นเช่นนั้นให้แน่ใจว่าคุณกำลังส่งออกตัวแปรของคุณ

myVar=testvalue; export myVar

ฉันได้รับ null เว้นแต่ฉันจะใช้การส่งออกเพื่อกำหนดค่าทั่วโลก

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