文章分類(lèi):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.trustice.com/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)分享。