在Java中运行时设置Windows PATH环境变量

时间:2010-04-29 22:24:49

标签: java windows environment-variables runtime.exec

我有一个使用Runtime.exec()方法触发可执行文件的java程序。我使用的变量将一组命令行参数作为一个参数,并将一些环境变量作为另一个参数。

我尝试设置的环境变量是path,所以我传入“PATH = C:\ some \ path”。这不起作用。这个或任何替代方案都有一些技巧。遗憾的是,我坚持使用Java 1.4。

4 个答案:

答案 0 :(得分:7)

使用http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#getenv%28java.lang.String%29来获取环境并进行修复,然后使用[http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runtime.html#exec%28java.lang.String,%20java.lang.String[],%20java.io.File%29][1]的风格来执行此操作。

这适用于包含路径的批处理文件。

package p;

import java.util.*;

public class Run {
    static String[] mapToStringArray(Map<String, String> map) {
        final String[] strings = new String[map.size()];
        int i = 0;
        for (Map.Entry<String, String> e : map.entrySet()) {
            strings[i] = e.getKey() + '=' + e.getValue();
            i++;
        }
        return strings;
    }

    public static void main(String[] arguments) throws Exception {
        final Map<String, String> env = new HashMap<String, String>(System.getenv());
        env.put("Path", env.get("Path") + ";foo");
        final String[] strings=mapToStringArray(env);
        Runtime.getRuntime().exec("cmd /C start foo.bat",strings);
    }

}

答案 1 :(得分:2)

如果您的源代码中出现“PATH = C:\ some \ path”,那么它将是错误的,因为它会尝试转义该字符串中的's'和'p',您将使用“PATH = C:\\ some \\ path“而不是(转义斜杠)。此外,您不希望将其作为字符串直接传递,而是作为字符串的数组传递(可能是其中唯一的字符串)。

答案 2 :(得分:2)

如果你想在Windows上更改Path变量,你应该看看JNI_Registry:http://www.trustice.com/java/jnireg/

它是对Windows注册表API的Java绑定,占用空间非常小。 我已经将它用于我当前的项目,它的工作正常。

答案 3 :(得分:1)

一种解决方案可能是在“exec”中添加一个额外的命令来设置路径......如下例所示: http://www.neowin.net/forum/topic/620450-java-runtimegetruntimeexec-help/

摘录:

            cmd = new String[7];
            cmd[0] = "cmd"; 
            cmd[1] = "/C";
            cmd[2] = "set PATH=C:\\Program Files\\Java\\jdk1.6.0_04\bin";
            cmd[3] = "copy " + "\"" +path + "\\" +name+ "\"" + " C:\\java";
            cmd[4] = "chdir C:\\java";
            cmd[5] = "javac *.java";
            cmd[6] = "jar cmf mainClass.txt"+" name"+".jar *.class";

            try{
            Runtime.getRuntime().exec(cmd);