tl; dr:當我試圖從一個類執行shell命令時Groovy找不到一個程序(phantomjs
,位於我的$PATH
) - 否則從Groovy控制檯或從Grails CLI腳本。是什麼賦予了?爲什麼Groovy無法找到這個程序,即使它在我的PATH上?
我們有一個Grails腳本來執行PhantomJS(「無頭WebKit」)中的JavaScript單元測試。當這些測試在一個獨立的腳本中執行(稱爲grails test-js
)時,事情可以正常工作。從Grails的/ Gant腳本文件中的相關行是:
// where 'jsTests' is a List with the paths to each test
def failures = 0
jsTests.each {
Process p = "phantomjs lib/phantom-jasmine/lib/run_jasmine_test.coffee file://${it}".execute()
failures += p.exitValue()
}
但是因爲我們希望這是通常的grails test-app
週期的一部分運行,我們創建的org.codehaus.groovy.grails.test.GrailsTestType
的實現。當我們到達在執行我們需要執行的測試,同樣的代碼部分(如上)不工作,和Groovy/Grails的抱怨說:
java.io.IOException: Cannot run program "phantomjs": error=2, No such file or directory
我的第一個念頭是phantomjs
是不在我的$PATH
- 但我知道它是,並且再次:它從Grails/Gant腳本運行時工作。所以我在Groovy控制檯中嘗試了它,並且從那裏可以正常工作。
現在,如果我從phantomjs
切換到/absolute/path/to/phantomjs
,那麼它工作正常。但是將絕對文件系統路徑硬編碼到類中並不是解決方案。
所以:Groovy爲什麼在這種情況下找到phantomjs
?
更新:我懷疑這可能與我的IDE(IntelliJ Idea)有關,因爲從命令行運行此錯誤時不會發生此錯誤。
這很有幫助,因爲它告訴我,當該類正在執行時'phantomjs'不在我的'$ PATH'上,但它仍不能解釋爲什麼它在其他上下文中可用。這至少指出了可能的後備計劃。 – founddrama