2

有没有办法将特定目录添加到 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 进程的 %PATH% 变量。原因是,我需要加载一些相互交叉引用的本机 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

3 回答 3

9

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

很难更改永久的、系统范围的路径设置。但是您可以在调用一个或多个您需要的程序期间更改路径。

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


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

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


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

我在这里考虑的是启动一个新的 JVM。您可以exec(cmd, envp)使用envp. 只需复制已经存在的内容并操作 的内容(PATH如果有)。

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

于 2009-12-22T11:13:35.113 回答
1

仅运行批处理文件是不可能的。详情请看这里。

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

于 2009-12-22T11:14:53.410 回答
1

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

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

于 2009-12-22T13:43:20.637 回答