用java實(shí)現(xiàn)修改系統(tǒng)的環(huán)境變量并使其不需重啟就生效文章分類:Java編程java 不能直接修改windows系統(tǒng)的環(huán)境變量,需要借助JNI轉(zhuǎn)為C++的接口,以調(diào)用windows系統(tǒng)的注冊(cè)表。(可以理解c++畢竟是微軟推出的開(kāi)發(fā)語(yǔ)言,OS源代碼并未開(kāi)放);目前,有開(kāi)源項(xiàng)目實(shí)現(xiàn)了這個(gè)轉(zhuǎn)換過(guò)程,使用版本:registry-3.1.3.zip;將壓縮包bin目錄中的jar包(registry.jar)導(dǎo)到工程中,然后在把相同目錄下的dll(ICE_JNIRegistry.dll)放到j(luò)dk的bin目錄下。
(ps:如其說(shuō)修改環(huán)境變量,不如說(shuō)修改注冊(cè)表更準(zhǔn)確些,因?yàn)槭峭ㄟ^(guò)修改注冊(cè)表來(lái)實(shí)現(xiàn)修改環(huán)境變量的;“環(huán)境變量”的鍵值所在位置:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment ) Windows Registry API Native Interface下載地址 http://www./java/jnireg/index.shtml 下 registry-3.1.3.zip(包含源代碼)。解開(kāi) registry-3.1.3.zip,在 bin 目錄中可以看到兩個(gè)文件 ICE_JNIRegistry.dll 和registry.jar,動(dòng)態(tài)庫(kù)就是本地代碼實(shí)現(xiàn)。 修改環(huán)境變量path 或 classpath ,代碼如下: package com.test; import java.io.BufferedReader; import java.io.InputStreamReader; import com.ice.jni.registry.RegStringValue; import com.ice.jni.registry.Registry; import com.ice.jni.registry.RegistryKey; public class RegistryTest { public static void main(String[] str) { try { RegistryKey openPath1 = Registry.HKEY_LOCAL_MACHINE .openSubKey("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"); String path_Old = openPath1.getStringValue("Path"); //獲取原Path鍵值 RegistryKey openPath2 = Registry.HKEY_LOCAL_MACHINE .openSubKey("SYSTEM\\CurrentControlSet\\Control\\Session Manager"); RegistryKey subKey = openPath2.createSubKey("Environment", ""); //定義Path所在目錄的句柄(相當(dāng)于在Session Manager路徑下面,新建Environment文件夾,如果存在不改變已有的值。) // String path_New = path_Old + ";" + "D:\\myTinoProject\\bingy"; String path_New = path_Old + "bin;"; subKey.setValue(new RegStringValue(subKey, "Path", path_New)); //修改Path鍵值 subKey.closeKey(); //查看進(jìn)程的方法 String[] cmd = { "D:\\dfqd\\workspace\\tasklist" }; Process proc = Runtime.getRuntime().exec(cmd); BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream())); String string_Temp = in.readLine(); while (string_Temp != null) { System.out.println(string_Temp); string_Temp = in.readLine(); } //刪除explorer.exe進(jìn)程 Process proc2 = Runtime.getRuntime().exec("D:\\dfqd\\workspace\\taskkill /F /IM explorer.exe"); Thread.sleep(500); //重啟explorer.exe進(jìn)程 Process proc3 = Runtime.getRuntime().exec("explorer.exe"); System.out.println("=====SUCCESS====="); } catch (Exception e) { e.printStackTrace(); } } } 注:如有下面的錯(cuò)誤提示,句柄(subKey)未定義正確。 com.ice.jni.registry.RegistryException: Registry API Error 5, 'access denied' - 'RegSetValueEx()' 說(shuō)明: (1)代碼后面的刪除explorer.exe進(jìn)程和重啟explorer.exe進(jìn)程就是為讓設(shè)置好path后在不重啟電腦的情況下生效,具體驗(yàn)證:cmd-->javac有效。 (2)中間睡0.5秒的意思是現(xiàn)在的電腦太牛了,還沒(méi)刪的時(shí)候就啟了。 (3)代碼之后會(huì)做詳細(xì)的封裝,封裝好后再貼上來(lái)分享。 |
|