如何在java中设置环境变量

时间:2014-12-26 06:52:27

标签: java environment-variables

我想在JAVA中设置环境变量。为此,我在互联网上搜索了很多,并获得了以下代码。

void set_up_environment_var() throws IOException
{
     ProcessBuilder pb = new ProcessBuilder("CMD.exe", "/C", "SET"); // SET prints out the environment variables  
     pb.redirectErrorStream(true);  

     Map<String,String> env = pb.environment();  

     String str1 = ";C:\\naved\\bin";
     String path = env.get("Path") ;//+ ";C:\\naved\\bin";  
     System.out.println("ok , I am coming . "+path.toLowerCase().contains(str1.toLowerCase()));
     env.put("Path", path.concat(str1));  
     Process process = pb.start();  
     BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));  
     String line;  
     while ((line = in.readLine()) != null)  
     {  
    //     System.out.println(line);  
     }  
}

但执行后,envorinment变量未在“PATH”变量中设置。为什么?

2 个答案:

答案 0 :(得分:4)

进程只能设置自身的环境变量以及将来会产生的进程。进程无法设置已在运行的进程的环境变量。

您可能已经注意到,当您在系统中全局手动设置环境变量时。它们不会影响已在运行的进程的实例,例如已在运行的cmd.exe或已在运行的bash。您可能还注意到,如果以这种方式设置环境变量,则新进程是否获得新环境变量设置取决于新进程的启动方式。默认行为是,使用其父进程的环境副本启动进程,该进程是启动新进程的进程。

作为一个简单的解释,您可以说有根进程和子进程。根进程从全局设置中获取环境设置,子进程从其父进程继承环境设置。

问题是您希望通过设置环境实现什么目标?我至少可以想到你想要实现的三件事:

  • 全局设置环境,作为安装程序的一部分。
  • 为当前运行的JVM设置环境。
  • 设置您将要开始的流程的环境。
  • 直接设置调用进程的环境(不可能!)。
  • 间接设置调用进程的环境。

作为安装程序的一部分全局设置环境

这是高度系统特定的。 在UNIX上,实际上避免了这个主题。 程序宁愿提供设置环境的包装脚本,而不是设置全局环境变量。 UNIX中的理念是,通常环境变量仅用于变量不仅仅对一个进程有用的情况。 此类变量的示例包括PATHEDITOR

在Windows上,您可能会调用regedit来修改环境。

设置当前运行的JVM的环境

没有用于设置当前运行的JVM的环境的API,因此您必须使用JNI。但是,请注意,没有API的事实有充分的理由,部分原因可能是JVM不希望某些Java代码任意更改其环境。

为将要启动的进程设置环境

当您使用Runtime.exec()方法之一启动流程时,您实际上可以提供您喜欢的环境。

如果您想要使用已修改的环境启动流程,最好的方法是使用ProcessBuilder。它提供了一种方法environment(),用于修改新进程的环境。

直接为调用进程设置环境

如果要在Java中实现set命令,请忘记它,这是不可能的。 set不是程序,它是shell的内部命令,即cmd.exe。由于上面的解释,它不会起作用。

间接设置调用进程的环境

您可以间接设置调用进程的环境 - 如果调用进程合作。如果您的调用进程是cmd.exesh,您可以让Java程序生成临时批处理文件或shell脚本,然后让调用cmd.exesh执行该操作批处理文件或shell脚本。

答案 1 :(得分:2)

如何在命令行中使用setx.exe设置路径的简单示例:

setx path "jdk bin path"

setx path "C:\Program Files (x86)\Java\jdk1.7.0_04\bin"

在你的代码上试试这个

    try {

        // using the Runtime exec method:
        Process p = Runtime.getRuntime().exec("setx path C:\Program Files (x86)\Java\jdk1.7.0_04\bin");

        BufferedReader stdInput = new BufferedReader(new
             InputStreamReader(p.getInputStream()));

        BufferedReader stdError = new BufferedReader(new
             InputStreamReader(p.getErrorStream()));

        // read the output from the command
        System.out.println("Here is the standard output of the command:\n");
        while ((s = stdInput.readLine()) != null) {
            System.out.println(s);
        }

        // read any errors from the attempted command
        System.out.println("Here is the standard error of the command (if any):\n");
        while ((s = stdError.readLine()) != null) {
            System.out.println(s);
        }

        System.exit(0);
    }
    catch (IOException e) {
        System.out.println("exception happened - here's what I know: ");
        e.printStackTrace();
        System.exit(-1);
    }