2016-11-30 84 views
0

這一問題與上一個問題,在這裏:Java Runtime.getRuntime().exec() appears to be overwriting $PATH大廈轉到失敗測試的exec()

我試圖從Java內從源代碼編譯圍棋程序。我可以使用Terminal正確地構建它,但是Java的Runtime.getRuntime()。exec()會得到有趣的結果。我嘗試使用ProcessBuilder,但無法讓它正確地製作Go。使用我的當前設置與exec(),它正確,但然後通過兩次測試失敗。代碼片段:

String[] envp = new String[4]; 
envp[0] = "CC=/usr/bin/clang"; 
envp[1] = "GOROOT_BOOTSTRAP=/usr/local/go"; 
envp[2] = "CGO_ENABLED=0"; 
envp[3] = "PATH=" + System.getenv().get("PATH"); 
Runtime.getRuntime().exec("./all.bash", envp, "$HOME/Desktop/go/src"); 

它正常運行和編譯正確,但是當它到達運行測試套件,我得到兩個錯誤:

--- FAIL: TestCurrent (0.00s) 
user_test.go:24: Current: user: Current not implemented on darwin/amd64 (got &user.User{Uid:"502", Gid:"20", Username:"", Name:"", HomeDir:""}) 
FAIL 
FAIL os/user 0.009s 

和更長的一個,我不會糊這裏因荒謬的長度,但它歸結爲:

panic: test timed out after 3m0s 
... 
FAIL runtime 180.056s 

我沒有,爲什麼前者是失敗的任何想法,但在運行時,當我從終端打造,它說:

ok  runtime 19.096s 

因此,有些事情會造成這種情況需要花費荒謬的時間。我做了一些Google搜索,聽說如果我使用ARM = 5作爲環境變量,它可能會被修復,但這並沒有改變任何東西。有沒有人有任何想法,當我從Java構建而不是終端時,爲什麼這些測試失敗?

+0

如果測試對你來說不是非常重要的話,你總是可以試着運行'make.bash'。 – captncraig

+0

爲了讓'User.Current()'起作用,你需要啓用cgo,你用'CGO_ENABLED = 0'來禁用。看問題[這裏](https://github.com/golang/go/issues/6376#issuecomment-66085388)。 –

+0

@ ivan.sim它嚴格來說不是「不工作」。它只是一個[後備](https://github.com/golang/go/blob/964639cc338db650ccadeafb7424bc8ebb2c0f6c/src/os/user/lookup_stubs.go#L22)實現,相信一些環境變量。 – captncraig

回答

0

查看os/user軟件包的源代碼,看起來native user handling取決於是否啓用了cgo。如果cgo = 0(您的情況),它將回退到USERHOME環境變量。

source code in question

嘗試把USER=whatever在Exec環境。

恐怕我需要更多信息來診斷運行時問題。

+0

我試着添加環境變量「envp [4] =」USER = whatever「;」但得到了同樣的錯誤,所以我試着「envp [4] =」USER = 「;」和「envp [4] =」HOME =/Users/「;」 (分開),但每次都得到相同的錯誤。我在這裏做錯了什麼? – user1914745

+0

如果你想完整的運行時錯誤,它在http://pastebin.com/5XnGzysq – user1914745

+0

@ user1914745看起來你也需要設置HOME以某種價值以及。抱歉。 – captncraig