2012-12-24 95 views
9

我能夠通過RunTime類運行Linux命令。 有沒有一種從編程的方式從Java設置Linux全局環境的方法?用Java以編程方式設置Linux環境變量

我想對Java

[email protected]:/tmp# export TEST=v2 

我已經使用的ProcessBuilder如下效仿以下Linux命令語句,但測試變量不發生變化。

ProcessBuilder pb = new ProcessBuilder("/bin/bash","-c","export TEST=v3" + "&& exec"); 

UPDATE: 其實我的最終目標是使用EMAIL_NAME環境作爲一個電子郵件地址,當我的兩個應用程序和機器被啓動,stopeed這些行爲將被髮送到EMAIL_NAME。 在這種情況下,我明白,不可能通過純Java代碼設置linux全局環境。所以我有一個解決方法是EMAIL_NAME將被保存在一個文件中,並且它將被更新或通過linux腳本或java代碼讀取。

+0

這裏用'Linux'命令表示什麼意思? –

+0

如果您使用'ProcessBuilder',當然可以在執行命令之前使用'.environment()'修改該映射的環境變量映射。 – fge

+0

相似的答案:http://stackoverflow.com/questions/580085/is-it-possible-to-set-an-environment-variable-at-runtime-from-java - 雖然使用「ProcessBuilder」只會設置環境對於所有分叉的進程(進程由於從Java進程中調用而運行)。 – birryree

回答

9

環境變量在設置時只能用於設置變量的進程產生的進程,所以如果你真的要設置一個影響整個系統的變量,那麼不會。交互式地在Linux中完全不能這樣做。你可以做的最好的辦法是修改其中一個系統啓動文件以包含所述變量,這樣你在未來的任何事情都會包含該變量。

如果您只是想用某些變量集運行幾個進程,那麼ProcessBuilder允許您爲其產生的進程set an environment。對於幾個進程重用一個環境是非常微不足道的。

-1

我使用這行代碼在bash

echo -e PATH=\"/usr/lib/jvm/java-7-openjdk-i386/bin:\$PATH\" >> $HOME/.profile 

與地連接了本地用戶

+0

這應該可能是一個評論;不是答案。問題是,*在Java *中以編程方式設置Linux環境變量。當OP特意要求*「以編程方式使用Java」*時,爲什麼要提供Bash配方? – jww

2

當你說「全球Linux環境」的路徑,你的意思是Linux環境變量?如果是這樣,我認爲答案是否定的。因爲這不是一個java問題。當一個進程設置環境變量var時,它只能影響自身及其子進程。

+1

這不是Java問題,是嗎?如果我啓動一個新的終端窗口,執行「export TEST = v2」然後退出,它不會存在於父進程的環境中。如果我用C,C++,pascal,彙編程序,Java,Python或任何其他我們能想到的語言編寫,那也是一樣。 –

+0

@MatsPetersson我的排字錯誤。我剛剛發現我錯過了不是。我的意思是「這不是一個Java問題」。 – TieDad

+0

啊,是的,這讓整個句子變得更好! –

1

您可以通過Java

if(System.getProperty("TEST", "").equalsIgnoreCase("")) 
{ 
    Runtime.getRuntime().exec(new String[]{"bash","-c" ,"echo 'export TEST=v2' >> /etc/profile"}) ; 

    /// Also update the System Variable for current process 
    System.setProperty("TEST","v2") ; 
} 

更新變量在/ etc/profile文件,這將得到有效的從下次登錄或者如果你明確地獲取它。

+0

每次都會有新的TEST變量插入到/ etc/profile中。 –

+0

只有當你每次運行java程序。但我認爲你只想運行一次。另一方面/ etc/profile會在用戶每次登錄時執行。 –

+0

此外,如果您計劃每次運行Java程序..那麼可能您應該首先檢查變量是否存在.. System.getProperty(「TEST 「)..如果它不存在,則將其設置在當前進程環境和/ etc/profile中 –