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

在Java中设置运行时的windows PATH环境变量,java,windows,environment-variables,runtime.exec,Java,Windows,Environment Variables,Runtime.exec,我有一个java程序,它使用Runtime.exec()方法触发一个可执行文件。我使用的变量将一组命令行参数作为一个参数,一些环境变量作为另一个参数 我试图设置的环境变量是path,因此我传入“path=C:\some\path”。这是行不通的。是否有一些诀窍,这或任何替代品。不幸的是,我坚持使用Java1.4 如果“PATH=C:\some\PATH”出现在源代码中,这将是不正确的,因为它将试图转义该字符串中的“s”和“p”,您将使用“PATH=C:\\some\\PATH”(转义斜杠)。此外

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

我试图设置的环境变量是path,因此我传入“path=C:\some\path”。这是行不通的。是否有一些诀窍,这或任何替代品。不幸的是,我坚持使用Java1.4

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

用于获取环境并修复它,然后使用的味道来执行

这适用于具有路径的批处理文件

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);
    }

}
p包;
导入java.util.*;
公营课{
静态字符串[]maptostringaray(映射){
最终字符串[]字符串=新字符串[map.size()];
int i=0;
对于(Map.Entry e:Map.entrySet()){
字符串[i]=e.getKey()+'='+e.getValue();
i++;
}
返回字符串;
}
公共静态void main(字符串[]参数)引发异常{
final-Map-env=newhashmap(System.getenv());
环境put(“路径”,环境get(“路径”)+“foo”);
最终字符串[]strings=maptostringaray(env);
Runtime.getRuntime().exec(“cmd/C start foo.bat”,字符串);
}
}

如果要更改windows上的Path变量,请查看JNI_注册表:

它是Windows注册表API的Java绑定,占用空间非常小。
我在当前的项目中使用过它,效果很好。

一个解决方案可能是在“exec”中添加一个额外的命令,在其中设置路径。。。如以下示例所示:

摘录:

            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);

这些都不起作用。我认为您不能为使用Runtime.execworks为我调用的进程更改windows路径变量。如果我mkdir foo并将bar.bat放在foo/中,并将exec更改为“cmd/C start bar.bat”,我会在windoze 8.1上看到bar.bat使用1.6的消息