2009-12-22 63 views
1

有没有办法将特定的目录添加到Windows系统变量%PATH%? 这似乎并不工作:用Java设置Windows系统变量

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

C:\测试\没有出现在System.getenv( “PATH”);或在输出

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

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

我想接下来的事情是一个小JNI的包装为C-功能 “运行putenv” 它看起来像这样:

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的地图是否未更新,或者putenv是否无效。有没有办法检查这个?

+0

是的,你可以使用一个简单的'System.getEnv( “PATH”)'直接从Java支票路径。 – 2009-12-22 14:24:58

回答

9

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

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

具体来说,要做的事情是自己编写一个批处理文件(.CMD.BAT,请你),设置PATH附近开始,请遵照不管你想与该路径执行DOS/Windows命令,然后exec()那个脚本文件。


更新当前的Java过程中的路径似乎很没有意义。 Java一旦运行就不关心路径。或者你正在运行一些库代码吗?

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


更新: OK,你有库的代码,其自身的原因,希望PATH设置得井井有条,而且你想给它想要的东西。

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

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

+0

嗨, 是的,我正在运行一些库代码。我编辑了我的问题。 – Philip 2009-12-22 12:08:33

+0

更新了我的建议,希望你会发现更新很有帮助。 – 2009-12-22 12:19:29

+0

感谢您的回答,但推出一个新的JVM是不是一种选择,因为我是一个小程序内运行(带签名的JAR)。我用JNI再次尝试更新了我的问题。 – Philip 2009-12-22 14:13:15

1

这是不可能的只是运行一个批处理文件。请参阅details

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

1

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

NASA世界风使用本机库,可以运行作为一个Applet,这里是与JNLPAppletLauncher设置此一HOWTO。这基本上做的是检测操作系统,获取适当的本地库,将它们保存在默认jvm路径中的位置并执行。从Java applet调用exec侵犯了各种安全和沙箱原理,我真的会避免它。

+0

对于java.library.path,我会说这是值得一试!但显然该应用程序是一个小程序,所以不幸的批处理似乎是出 – 2009-12-22 16:41:10

0

您可以尝试使用setenv.exe(从here)而不是cmd /c
setx.exeMicrosoft