用java实现修改系统的环境变量并使其不需重启就生效

java 不能直接修改windows系统的环境变量,需要借助JNI转为C++的接口,以调用windows系统的注册表。(可以理解c++毕竟是微软推出的开发语言,OS源代码并未开放);目前,有开源项目实现了这个转换过程,使用版本:registry-3.1.3.zip;将压缩包bin目录中的jar包(registry.jar)导到工程中,然后在把相同目录下的dll(ICE_JNIRegistry.dll)放到jdk的bin目录下。

(ps:如其说修改环境变量,不如说修改注册表更准确些,因为是通过修改注册表来实现修改环境变量的;“环境变量”的键值所在位置: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(包含源代码)。解开 registry-3.1.3.zip,在 bin 目录中可以看到两个文件 ICE_JNIRegistry.dll 和registry.jar,动态库就是本地代码实现。

修改环境变量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所在目录的句柄(相当于在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();

//查看进程的方法
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进程
Process proc2 = Runtime.getRuntime().exec("D:\\dfqd\\workspace\\taskkill /F /IM explorer.exe");
Thread.sleep(500);
//重启explorer.exe进程
Process proc3 = Runtime.getRuntime().exec("explorer.exe");
System.out.println("=====SUCCESS=====");
} catch (Exception e) {
e.printStackTrace();
}
}
}

注:如有下面的错误提示,句柄(subKey)未定义正确。

com.ice.jni.registry.RegistryException: Registry API Error 5, 'access denied' - 'RegSetValueEx()'

说明:
(1)代码后面的删除explorer.exe进程和重启explorer.exe进程就是为让设置好path后在不重启电脑的情况下生效,具体验证:cmd-->javac有效。
(2)中间睡0.5秒的意思是现在的电脑太牛了,还没删的时候就启了。
(3)代码之后会做详细的封装,封装好后再贴上来分享。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值