繁体   English   中英

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

[英]set windows PATH environment variable at runtime in Java

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

我要设置的环境变量是路径,所以我传入“PATH=C:\\some\\path”。 这不起作用。 是否有一些技巧或任何替代方法。 不幸的是,我坚持使用 Java 1.4。

使用getenv获取环境并修复它,然后使用exec的风格来执行 exec。

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

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

}

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

如果要更改 Windows 上的 Path 变量,您应该查看 JNI_Registry: http : //www.trustice.com/java/jnireg/

它是与 Windows Registry API 的 Java 绑定,占用空间非常小。 我已经将它用于我当前的项目,并且效果很好。

一种解决方案可能是在您设置路径的“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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM