有没有办法将特定目录添加到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是否不起作用。有没有办法检查这个?
答案 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)