2015-04-21 15 views
23

Próbuję uzyskać System.getenv(), aby uzyskać wartość zmiennej środowiskowej ustawionej przez mój terminal (Mac), ustawię również zmienną w moim pliku .bash_profile i ponownie załadowany. Po wykonaniu tej czynności wyświetliłem echo wartości i poprawną wartość wydrukowano na terminalu. Gdy próbuje pobrać wartość zmiennej (I upewnił się, że był przy użyciu poprawnej nazwy zarówno w moim pliku .bash_profile i przy użyciu System.getenv().System.getenv() zwraca null, gdy istnieje zmienna środowiskowa

W poniższym kodzie, jakie otrzymuje nazwę zmiennej z var_name:

String varValue = System.getenv("VAR_NAME"); 
System.out.println("Value: " + varValue); 

W moim bash_profile.

export VAR_NAME="foo" 

"null" jest drukowany kiedy wydrukować wartość varValue

Co może być tego przyczyną?

Edytuj: Podążyłem za najlepszą odpowiedzią here, zrestartowałem Eclipse i zadziałało!

+1

Jak działa aplikacja? Czy 'printenv | grep VAR_NAME' w twojej powłoce pokazuje wartość? –

+0

To działa, a ja używam go przez Eclipse @EtanReisner – SamTebbs33

+1

Uruchomisz polecenie powłoki w Eclipse? – RealSkeptic

Odpowiedz

44

Odpowiedź na to pytanie jest bardziej ogólna niż tylko System.getenv() w Javie.

Zmienne środowiskowe przechodzą tylko w dół drzewa procesu i tylko wtedy, gdy proces jest uruchamiany. Eclipse to proces potomny powłoki - dlatego po uruchomieniu Eclipse odziedziczył on wszystkie zmienne środowiskowe zdefiniowane w powłoce .

Prawdopodobnie zdefiniowałeś zmienną środowiskową na swojej powłoce po uruchomiłeś Eclipse, stąd Eclipse i podrzędne procesy Java, które stworzyły, nigdy nie wiedziały o twojej nowej zmiennej środowiskowej.

Z powodu takiego zachowania, rozwiązaniem tutaj jest wyjście z Eclipse i ponowne uruchomienie z powłoki, w której zmienna środowiskowa jest już zdefiniowana. Inną opcją jest przejście do konfiguracji uruchamiania projektu i zdefiniowanie tam zmiennej środowiskowej.

+1

Zmienną środowiskową zdefiniowano w rzeczywistości przed uruchomieniem Eclipse. Nawet zrestartowałem komputer po zdefiniowaniu zmiennej, kiedy nie działało zgodnie z zamierzeniami. Odpowiedź podana w linku podanym w moim PO naprawiła problem. – SamTebbs33

+0

To oczywiście nie działa po ponownym uruchomieniu komputera, ponieważ te zmienne są zdefiniowane dla każdego procesu. Nie pozostają one zdefiniowane na zawsze ... – SomethingSomething

+0

Można wyobrazić sobie mechanizm zmiennych środowiskowych jako tablicę skrótów, która istnieje wzdłuż procesu. Zawsze możesz go zaktualizować, dodając/usuwając/zmieniając zmienne. Po zamknięciu procesu (na przykład przez zamknięcie powłoki lub ponowne uruchomienie komputera) ta tablica skrótów kończy działanie. Inną ważną rzeczą, którą napisałem już w odpowiedzi, jest to, że każdy proces dziedziczy (faktycznie kopiuje) tę tablicę skrótów od procesu, który ją utworzył, w czasie jej tworzenia. Po utworzeniu mają różne tabele mieszania, żadne z nich nie wie o innych – SomethingSomething

Powiązane problemy