使用Java设置Windows系统变量

时间:2009-12-22 11:09:37

标签: java windows environment

有没有办法将特定目录添加到Windows系统变量%PATH%? 这似乎不起作用:

String[] cmd = { "cmd", "/c", "set", "PATH=\"%PATH%;c:\\test\"" };
Runtime.getRuntime().exec( cmd );

c:\ test \没有出现在System.getenv(“PATH”)中;或者在

的输出中
String[] cmd = { "cmd", "/c", "echo", "%PATH%" };
Runtime.getRuntime().exec( cmd );

我需要修改Windows下当前Java-Process的%PATH%-variable。原因是,我需要加载一些相互交叉引用的本机dll文件。所以我想将应用程序路径添加到Windows环境中。

我接下来尝试的是一个用于C-Function“putenv”的小型JNI-Wrapper,它看起来像这样:

JNIEXPORT void JNICALL Java_com_splitscreen_AppletTest_PutEnv_putEnv
  (JNIEnv *env, jobject jobj, jstring val) {

    jboolean iscopy;

    const char *mvalue = (*env)->GetStringUTFChars(
                env, val, &iscopy);

    putenv(mvalue);
}

这就是我所说的:

final String curPath = System.getenv( "PATH" );
final PutEnv pe = new PutEnv();
pe.putEnv( "PATH=" + curPath + ";c:\test" );

final String newPath = System.getenv( "PATH" );
System.out.println( newPath );

但是这些都是平等的。我不确定Java-System-Environment的Map是否未更新或者putenv是否不起作用。有没有办法检查这个?

4 个答案:

答案 0 :(得分:9)

这不起作用的原因是两个exec()调用启动了两个不同的shell;您设置路径的那个不是您签入的路径。

很难更改永久的系统范围路径设置。但是,您可以在调用所需的一个或多个程序的持续时间内更改路径。

具体来说,要做的就是自己写一个批处理文件(.CMD.BAT),将PATH设置在开头附近,然后用任何DOS编写/ Windows命令,您希望使用该路径执行,然后exec()该脚本文件。


更新当前 Java 进程的PATH似乎毫无意义。 Java一旦运行,就不关心路径了。或者你正在运行一些库代码吗?

如果您使用exec()从Java运行DOS / Windows命令,则上述技巧将起作用。


更新:好的,你有库代码,由于它自己想要PATH设置,你想要它给它想要的东西。

我在这里考虑的是启动一个新的JVM。您可以使用exec(cmd, envp)envp中使用一组自定义环境变量启动新的Java应用程序(“自己”,在紧要关头)。只需复制已经存在的那些并操纵PATH的内容(如果有的话)。

启动新Java应用程序的标准方法是创建一个新的ClassLoader,并且有关于如何实现这一点的各种描述。但我不确定你是否可以使用该程序来创建一个新环境 - 所以exec - JVM可能不仅更简单,而且可能是唯一的方法。

答案 1 :(得分:1)

仅运行批处理文件是不可能的。请参阅此处details

您的解决方案不起作用,因为它只修改了流程级别而不是系统级别的环境变量。

答案 2 :(得分:1)

如果使用JNI扩展,则可以通过-Djava.library.path选项将路径传递到本地库所在的位置,这也可能适用于您的exec案例。另一个选项是从批处理文件启动Java应用程序并在启动Java应用程序之前在命令解释程序中编辑PATH设置,java应用程序将继承此PATH设置。

NASA WorldWind使用本机库,可以作为Applet运行,以下是使用JNLPAppletLauncher进行设置的方法。这基本上做的是检测操作系统,获取适当的本机库,将它们保存在默认的jvm路径中的位置并执行。从Java applet调用exec违反了各种理智的安全性和沙盒原则,我真的会避免它。

答案 3 :(得分:0)

您可以尝试使用setenv.exe(来自here)代替cmd /c
或来自Microsoftsetx.exe