有没有办法将特定的目录添加到Windows系统variables%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进程的%PATH%variables。 原因是,我需要加载一些本机的dll文件相互参照。 所以我想将应用程序path添加到Windows环境。
接下来我尝试了一个C语言函数“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 );
但是path是平等的。 我不确定Java-System-Environment的Map是否没有更新,或者putenv是否不工作。 有没有办法检查这个?
这不起作用的原因是两个exec()
调用启动两个不同的shell; 你设定的路径不是你检查的路径。
改变永久性的全系统路径设置是很困难的。 但是,您可以在调用一个或多个您需要的程序的过程中更改路径。
具体来说,要做的就是自己写一个批处理文件( .CMD
或.BAT
,如你.CMD
),把PATH
设置在开始位置,然后用你想用该路径执行的任何DOS / Windows命令,以及然后exec()
那个脚本文件。
更新当前Java进程的PATH看起来毫无意义。 Java一旦运行就不关心路径。 或者你正在运行一些库代码呢?
如果您使用exec()
从Java运行DOS / Windows命令,则上述技巧将起作用。
更新:好的,你有一个库代码,因为它自己的理由就是这样设置PATH,并且你想给它它想要的东西。
我想在这里考虑的是启动一个新的JVM。 您可以使用exec(cmd, envp)
在envp
使用一组自定义的环境变量来启动一个新的Java应用程序(“你自己”)。 只要复制那些已经存在的并且操作PATH
的内容(如果有的话)。
启动一个新的Java应用程序的标准方法是创建一个新的ClassLoader
,并且有关于如何完成这个的各种描述。 但是我不确定你可以使用这个过程来创建一个新的环境 – 所以JVM的exec
不仅可以简单,而且可能是唯一的方法。
这仅仅是运行一个批处理文件是不可能的。 详情请看这里。
您的解决方案不起作用,因为它只修改过程级别的环境变量,而不是系统级别的环境变量。
如果您使用的是JNI扩展,您可以通过-Djava.library.path选项将路径传递到本机库所在的位置,这也可能适用于您的执行情况。 另一个选择是从批处理文件启动Java应用程序,并在启动java应用程序之前在命令解释器中编辑PATH设置,Java应用程序将继承此PATH设置。
美国宇航局的WorldWind使用本地库,可以作为一个Applet运行,这里是一个如何使用JNLPAppletLauncher进行设置的方法 。 这基本上做的是检测操作系统,获取适当的本地库,将它们保存在默认的jvm路径中的位置并执行。 从一个Java applet调用exec侵犯了各种健全的安全和沙箱原则,我真的会避免它。
您可以尝试使用setenv.exe
(从这里 )而不是cmd /c
。
或Microsoft的 setx.exe
。