Jak uzyskać wartość zmiennej systemowej w Javie?

169

Jak mogę uzyskać wartość zmiennej systemowej, która jest obecna w

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

w Javie?

Edytować

Użyłem System.getenv()metody.

To jest wartość drukarska, jeśli podam

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

i pokazuje nullwartość, jeśli spróbuję tego samego dla utworzonej przeze mnie zmiennej systemowej

System.out.println(System.getenv("DBE"));
radża
źródło
5
Możesz spróbować ponownie uruchomić proces żądania (w moim przypadku NetBeans).
Kotodid,
3
Zauważyłem, że opcja restartu z zaćmienia nie działa. Po prostu zamknij aplikację i uruchom ją ponownie.
Yasin
1
Ponowne uruchomienie IntelliJ rozwiązało mój problem.
Bhushan Karmarkar
Ponowne uruchomienie systemu działało u mnie, może JVM przechowuje bufor wartości przy pierwszym uruchomieniu, dzięki czemu nowe zmienne nie są wykrywane.
sumitkanoje

Odpowiedzi:

52

Aby wyjaśnić, zmienne systemowe są takie same jak zmienne środowiskowe. Zmienne środowiskowe użytkownika są ustawiane dla każdego użytkownika i są różne, gdy loguje się inny użytkownik. Zmienne środowiskowe dotyczące całego systemu są takie same bez względu na to, który użytkownik się loguje.

Aby uzyskać dostęp do bieżącej wartości zmiennej systemowej lub zmiennej użytkownika w Javie, zobacz poniżej:

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

Więcej informacji na temat zmiennych środowiskowych można znaleźć na tej stronie Wikipedii .

Upewnij się również, że zmienna środowiskowa, którą próbujesz odczytać, jest poprawnie ustawiona przed wywołaniem języka Java, wykonując:

echo %MYENVVAR%

Powinieneś zobaczyć wartość zmiennej środowiskowej. Jeśli nie, może być konieczne ponowne otwarcie powłoki (DOS) lub wylogowanie się i ponowne zalogowanie.

Eliasz
źródło
Cześć .. Użyłem metody System.getenv () .. Itsprinting wartość, jeśli podam "System.out.println (System.getenv (" JAVA_HOME "));" i pokazuje wartość null, jeśli podam zmienną systemową utworzoną przeze mnie ("System.out.println (System.getenv (" DBE "));"
raja
3
getenvpowinno być w małym przypadku zamiast w getEnvprawo?
Pratik Khadloya,
1
Jeśli to zrobię echo %var%, drukuje %var%. Jeśli spróbuję zamiast echo $vartego, działa i wyświetla wartość tej zmiennej env. Mój getenvzwraca zero.
dialeks
3
@dialex %var%używany dla Windows, $vardla systemów unix / linux / MacOS.
Al-Mothafar
27

Podczas pobierania właściwości systemu / środowiska jest kilka interesujących szczegółów.

Najpierw System.getenv(String)został wprowadzony dawno temu, a następnie został wycofany. Wycofywanie (głupio, IHMO) trwało przez całą drogę do JSE 1.4 .

Został ponownie wprowadzony w JSE 5 .

Są one ustawiane za pomocą panelu Zmienne środowiskowe w systemie Windows. Zmiany w zmiennych mogą nie zostać pobrane, dopóki bieżąca maszyna wirtualna nie zostanie zamknięta, a wystąpienie CMD.exe zostanie zamknięte.

W przeciwieństwie do właściwości środowiska Java ma również właściwości systemowe Java, dostępne za pośrednictwem System.getProperties(). Te zmienne można zainicjować, gdy maszyna wirtualna jest uruchamiana przy użyciu argumentów wiersza polecenia serii . Na przykład wartości właściwości i są ustawiane w poniższym poleceniu:-Dname=valuemaxInMemorypagingDirectory

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

Te właściwości można modyfikować w czasie wykonywania, wykluczając ograniczenia zasad bezpieczeństwa.

Dilum Ranatunga
źródło
19

W rzeczywistości zmienna może być ustawiona lub nie, więc w Javie 8 lub wyższej jej wartość null powinna być opakowana w Optionalobiekt, co zapewnia naprawdę dobre funkcje. W poniższym przykładzie postaramy się uzyskać zmienną ENV_VAR1, jeśli nie istnieje, możemy rzucić niestandardowy wyjątek, aby ostrzec o tym:

String ENV_VAR1 = Optional.ofNullable(System.getenv("ENV_VAR1")).orElseThrow(
  () -> new CustomException("ENV_VAR1 is not set in the environment"));
EliuX
źródło
5

Google mówi, aby sprawdzić getenv () :

Zwraca niemodyfikowalny widok mapy ciągów bieżącego środowiska systemowego.

Nie jestem jednak pewien, czym różnią się zmienne systemowe od zmiennych środowiskowych, więc jeśli mógłbyś wyjaśnić, mógłbym pomóc więcej.

Chris Bunch
źródło
Myślę, że raja oznacza „systemowy” w przeciwieństwie do zmiennych środowiskowych „dla użytkownika”.
Rob
3

Czy próbowałeś ponownie uruchomić komputer od czasu ustawienia zmiennej środowiskowej?

Wygląda na to, że system Windows przechowuje swoją zmienną środowiskową w jakiejś pamięci podręcznej, a ponowne uruchomienie jest jedną z metod jej odświeżenia. Nie jestem pewien, ale może być inna metoda, ale jeśli nie zamierzasz zbyt często zmieniać wartości zmiennej, może to być wystarczająco dobre.

trylobita
źródło
3

Jak wspomniałem powyżej, ponowne uruchomienie eclipse działało dla mnie dla zmiennej środowiskowej zdefiniowanej przez użytkownika. Po ponownym uruchomieniu eclipse IDE System.getenv()pobiera moją zmienną środowiskową.

voidMainReturn
źródło
0

Czy korzystasz z systemu Linux? Jeśli tak, upewnij się, że eksportujesz zmienną.

myVar=testvalue; export myVar

Otrzymuję wartość null, chyba że używam eksportu do globalnego zdefiniowania wartości.

keving
źródło