2015-05-03 53 views
1

有沒有辦法使用Java更改Windows環境變量?我試圖與CMD功能set如何在Windows上持久定義Java環境變量?

Process exec = Runtime.getRuntime().exec(new String[] { 
     "cmd", "/c", "set", "HTTP_PROXY=" + PROXY_URL 
}); 

if (exec.waitFor() != 0) { 
    throw new IllegalStateException("Output: " 
     + getText(exec.getInputStream()) 
     + "Error: " + getText(exec.getErrorStream() 
     + "\n" 
     + "Exit value: " + exec.exitValue()); 
} 

此代碼運行沒有任何錯誤正常,但當我後來查看系統變量沒有發生任何變化。

我試圖更新HTTP_PROXY,以便其他運行在HTTP代理後面的軟件可以使用它。

+0

嗨Ramesh能否詳細介紹一下您嘗試實現的功能? – jirungaray

+0

你並沒有做出持久的改變。您僅更新您創建的流程中的值。 –

+0

我想更改HTTP_PROXY env var,以便我可以在代理之後運行諸如php composer之類的軟件。有沒有辦法做到這一點,而無需更改系統變量..? –

回答

4

過程是在由名稱 - 值對的環境推出了說明。當一個程序寫入一個env變量時,它可以選擇使這個寫入對子進程可見,但是當你檢查這個值時,你很可能使用了另一個無法訪問Java環境的進程(可能通過cmd.exe運行)程序。

我不知道您的代碼的目的是以持久方式定義環境變量,但如果是這種情況,則無法在沒有特定操作系統工具的情況下以獨立於平臺的方式在Java中完成。

環境變量默認值必須由系統工具保存在相同的系統工具讀取的地方。在Linux上,在用戶家中有.profile.bashrc這樣的文件,而在Windows上有註冊表。例如在我的Windows 7,我有:存儲在\HKEY_CURRENT_USER\EnvironmentPATH默認值 - 所以你必須找到一種方式來寫入系統註冊表,例如命令reg

REG ADD命令允許用戶添加新鍵和值的註冊表。要顯示可以使用的全範圍的參數,鍵入以下命令行:reg add /?

要在遠程計算機PC2,類型添加密鑰HKLM\Software\MyNewApp

REG ADD \\PC2\HKLM\Software\MyNewApp 

要添加註冊表項,以HKLM\Software\MyNewApp與名爲 DataREG_BINARY類型和fe340ead數據的類型的值,:

REG ADD HKLM\Software\MyNewApp /v Data /t REG_BINARY /d fe340ead 

您可以編寫.bat腳本或從Java程序中調用reg。您可能需要管理員權限並重新啓動某些程序(最終整個機器)才能使更新生效(例如重新啓動explorer.exe)

0

這是不可能的(至少永遠)。有很好的理由(隔離,java工具在不知不覺中改變你的env)。尋找一個黑客here

編輯:

一個複雜的解釋是由拉菲爾

+0

不,這不是我想要的東西。我想更改一個系統變量,以便其他軟件可以使用它。 (這些軟件不執行我的Java軟件).. 我認爲我的任務是不可能的,然後.. –

+0

多數民衆贊成在我的意思。通過手動更改路徑給予一般權限(爲什麼不呢,如果這是所需的效果)。你爲什麼要從Java永久設置它,如果你的ENV應該永久保留下來? – phiology