Làm cách nào tôi có thể nhận giá trị biến hệ thống trong Java?


169

Làm cách nào tôi có thể nhận được giá trị Biến hệ thống có trong

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

trong Java?

Biên tập

Tôi đã sử dụng System.getenv()phương pháp.

Đó là giá trị in nếu tôi cho

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

và nó đang hiển thị nullgiá trị nếu tôi thử tương tự với biến hệ thống do tôi tạo

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

5
Bạn có thể thử khởi động lại quy trình yêu cầu (NetBeans trong trường hợp của tôi).
Kotodid

3
Tôi đã quan sát thấy rằng tùy chọn khởi động lại từ nhật thực không hoạt động. Chỉ cần đóng ứng dụng, và bắt đầu lại.
Yasin

1
Khởi động lại IntelliJ đã giải quyết vấn đề của tôi.
Bhushan Karmarkar

Khởi động lại hệ thống làm việc cho tôi, có thể JVM giữ bộ đệm của các giá trị khi bắt đầu lần đầu tiên do các biến mới không được phát hiện.
sumitkanoje

Câu trả lời:



52

Để làm rõ, các biến hệ thống giống như các biến môi trường. Biến môi trường người dùng được đặt cho mỗi người dùng và khác nhau bất cứ khi nào người dùng khác đăng nhập. Biến môi trường toàn hệ thống là như nhau cho dù người dùng đăng nhập vào cái gì.

Để truy cập giá trị hiện tại của biến toàn hệ thống hoặc biến người dùng trong Java, xem bên dưới:

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

Để biết thêm thông tin về các biến môi trường, xem trang wikipedia này .

Ngoài ra, hãy đảm bảo biến môi trường bạn đang cố đọc được đặt đúng trước khi gọi Java bằng cách thực hiện:

echo %MYENVVAR%

Bạn sẽ thấy giá trị của biến môi trường. Nếu không, bạn có thể cần mở lại shell (DOS) hoặc đăng xuất và đăng nhập lại.


Xin chào .. Tôi đã sử dụng phương thức System.getenv () .. Giá trị in dấu nếu tôi đưa ra "System.out.println (System.getenv (" JAVA_HOME "));" và nó hiển thị giá trị null nếu tôi đưa ra biến hệ thống do tôi tạo ra ("System.out.println (System.getenv (" DBE "));"
raja

3
getenvnên trong trường hợp nhỏ thay vì getEnvphải không?
Pratik Khadloya

1
Nếu tôi làm echo %var%nó in %var%. Nếu tôi thử thay vào echo $varđó nó hoạt động và hiển thị giá trị của biến env đó. My getenvđang trở về null.
quay số

3
@dialex %var%được sử dụng cho windows, $varcho các hệ thống unix / linux / MacOS.
Al-Mothafar

27

Có một vài chi tiết quan tâm khi nhận các thuộc tính hệ thống / môi trường.

Đầu tiên, System.getenv(String)được giới thiệu cách trở lại khi, sau đó không dùng nữa. Sự phản đối (một cách ngu ngốc, IHMO) tiếp tục tất cả các cách vào JSE 1.4 .

Nó đã được giới thiệu lại trong JSE 5 .

Chúng được đặt bằng bảng Biến môi trường trong Windows. Các thay đổi đối với các biến có thể không được chọn cho đến khi VM hiện tại của bạn bị tắt và phiên bản CMD.exe được thoát.

Trái ngược với các thuộc tính môi trường, Java cũng có các thuộc tính hệ thống Java, có thể truy cập thông qua System.getProperties(). Các biến này có thể được khởi tạo khi VM được bắt đầu bằng cách sử dụng một đối số dòng lệnh. Ví dụ: các giá trị cho các thuộc tính và được đặt trong lệnh bên dưới:-Dname=valuemaxInMemorypagingDirectory

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

Các thuộc tính này có thể được sửa đổi trong thời gian chạy, chặn các hạn chế chính sách bảo mật.


19

Trên thực tế, biến có thể được đặt hoặc không, do đó, trong Java 8 hoặc cao hơn giá trị nullable của nó nên được gói vào một Optionalđối tượng, cho phép các tính năng thực sự tốt. Trong ví dụ sau, chúng tôi sẽ cố gắng lấy biến ENV_VAR1, nếu nó không tồn tại, chúng tôi có thể đưa ra một số Ngoại lệ tùy chỉnh để cảnh báo về nó:

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

5

Google nói để kiểm tra getenv () :

Trả về chế độ xem bản đồ chuỗi không thể thay đổi của môi trường hệ thống hiện tại.

Tuy nhiên, tôi không chắc các biến hệ thống khác với các biến môi trường như thế nào, vì vậy nếu bạn có thể làm rõ, tôi có thể giúp đỡ nhiều hơn.


Tôi nghĩ raja có nghĩa là "toàn hệ thống" trái ngược với các biến môi trường "trên mỗi người dùng".
Cướp

3

Bạn đã thử khởi động lại từ khi bạn đặt biến môi trường chưa?

Dường như Windows giữ biến môi trường của nó trong một số loại bộ đệm và khởi động lại là một phương pháp để làm mới nó. Tôi không chắc chắn nhưng có thể có một phương pháp khác, nhưng nếu bạn không thay đổi giá trị biến của mình quá thường xuyên thì điều này có thể đủ tốt.


3

Như đã đề cập bởi sombody ở trên, khởi động lại nhật thực làm việc cho tôi đối với biến môi trường do người dùng xác định. Sau khi tôi khởi động lại IDE nhật thực, System.getenv()đang chọn biến môi trường của tôi.


0

Bạn đang trên một hệ thống linux? Nếu vậy hãy chắc chắn rằng bạn đang xuất biến của bạn.

myVar=testvalue; export myVar

Tôi nhận được null trừ khi tôi sử dụng xuất để xác định giá trị trên toàn cầu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.