我想在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”变量中设置。为什么?
答案 0 :(得分:4)
进程只能设置自身的环境变量以及将来会产生的进程。进程无法设置已在运行的进程的环境变量。
您可能已经注意到,当您在系统中全局手动设置环境变量时。它们不会影响已在运行的进程的实例,例如已在运行的cmd.exe
或已在运行的bash
。您可能还注意到,如果以这种方式设置环境变量,则新进程是否获得新环境变量设置取决于新进程的启动方式。默认行为是,使用其父进程的环境副本启动进程,该进程是启动新进程的进程。
作为一个简单的解释,您可以说有根进程和子进程。根进程从全局设置中获取环境设置,子进程从其父进程继承环境设置。
问题是您希望通过设置环境实现什么目标?我至少可以想到你想要实现的三件事:
这是高度系统特定的。
在UNIX上,实际上避免了这个主题。
程序宁愿提供设置环境的包装脚本,而不是设置全局环境变量。
UNIX中的理念是,通常环境变量仅用于变量不仅仅对一个进程有用的情况。
此类变量的示例包括PATH
和EDITOR
。
在Windows上,您可能会调用regedit
来修改环境。
没有用于设置当前运行的JVM的环境的API,因此您必须使用JNI。但是,请注意,没有API的事实有充分的理由,部分原因可能是JVM不希望某些Java代码任意更改其环境。
当您使用Runtime.exec()
方法之一启动流程时,您实际上可以提供您喜欢的环境。
如果您想要使用已修改的环境启动流程,最好的方法是使用ProcessBuilder
。它提供了一种方法environment(),用于修改新进程的环境。
如果要在Java中实现set
命令,请忘记它,这是不可能的。 set
不是程序,它是shell的内部命令,即cmd.exe
。由于上面的解释,它不会起作用。
您可以间接设置调用进程的环境 - 如果调用进程合作。如果您的调用进程是cmd.exe
或sh
,您可以让Java程序生成临时批处理文件或shell脚本,然后让调用cmd.exe
或sh
执行该操作批处理文件或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);
}