使用Java设置Windows系统变量

Phi*_*lip 2 java windows environment

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

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

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

String[] cmd = { "cmd", "/c", "echo", "%PATH%" };
Runtime.getRuntime().exec( cmd );
Run Code Online (Sandbox Code Playgroud)

我需要的是修改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);
}
Run Code Online (Sandbox Code Playgroud)

这就是我所说的:

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 );
Run Code Online (Sandbox Code Playgroud)

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

Car*_*icz 9

这不起作用的原因是两个exec()调用启动两个不同的shell; 您设置路径的那个不是您检查的路径.

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

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


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

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


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

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

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