2012-02-12 63 views
0

echo $MY_FILE打印"/path/to/some/file"如何從Java程序內部訪問系統變量?

System.out.println(System.getenv("MY_FILE"));打印null

此外,當我打印JAVA_HOME(在Eclipse),我也得到null。從貝呼應/Library/Java/Home

不知道這是否是相關的,但系統我運行一個mac

任何提示?

回答

0

您可能尚未導出環境變量。在大多數shell,在shell聲明的變量不會被導出爲子的環境中,除非你明確地這樣做,無論是這樣的:

export MY_HOME=/somewhere/over/the/rainbow 

或調用程序時:

MY_HOME=/somewhere/over/the/rainbow java com.example.MyApplication 

同時請請注意環境不是全球性的,因此您對環境所做的更改只會影響該進程及其子進程。如果您想要影響系統上所有進程的環境,則必須專門對其進行配置。在大多數情況下,在shell中導出是你想要的。

+0

變量的環境中通過'export'語句設置爲我的'.profile',我已經手動初始化 – JAM 2012-02-12 02:25:37

0

首次嘗試訪問未創建的系統變量由你說

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

如果上述工作,請嘗試重新啓動虛擬機

看來,環境變量是在某種緩存,並重新啓動是一種刷新它的方法。

+0

當你說'重新啓動您的VM'的一部分,具體是什麼你意思?打印'JAVA_HOME'打印空以及 – JAM 2012-02-12 02:24:12

+0

重新啓動計算機/ OS。你看到了「JAVA_HOME」從控制檯? – mbh 2012-02-12 02:30:57

+0

嗯...回聲'$ JAVA_HOME'沒有任何打印。讓我設置它,然後再試一次 – JAM 2012-02-12 02:32:26

0

訪問環境變量的方式正是您意識到的方式。該代碼運行良好,並且您收到的結果可以準確地告訴您有關您所問問題的JVM的執行環境。所以,

  1. 環境變量不是'系統變量':它們沒有系統範圍;在新終端中更改它們不會在啓動終端等的過程中更改它們。

  2. 它們由OS進程保存,並被複制到該進程的子進程中。所以,孩子們在改變自己的時候也不會改變父母的環境變量。如果啓動Eclipse,然後在.profile或其他環境中設置環境變量,然後從Eclipse啓動的JVM不會反映這些設置,那麼您知道Eclipse在啓動之前不會啓動讀取.profile的shell JVM;它可以調用shell以使其不讀取.profile,它可以完全調用另一個shell,它可以直接啓動JVM,而不涉及shell。

  3. 如果您在設置這些變量之後啓動Eclipse並看到相同的行爲,那麼您已經學會了啓動Eclipse的過程。

  4. 如果重新啓動設置這些變量後,並看到相同的行爲,那麼你已經瞭解了你的窗口環境相同。

當你要求Java環境變量的值時,你不會知道自己「做錯了」,因爲你實際上做得很對。

您可以探索與System.getenv()