分享

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

 wangxq 2010-11-15

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

文章分类: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./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条评论

    发表

    请遵守用户 评论公约

    类似文章 更多