2009-12-22 99 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