为什么Groovy找不到这个程序,即使它在我的PATH上?

时间:2012-09-04 18:41:20

标签: macos grails groovy intellij-idea phantomjs

tl; dr:当我尝试从类中执行shell命令时,Groovy无法找到程序(phantomjs,这是我的$PATH) - 它是否则从Groovy控制台或Grails CLI脚本中找到它就好了。是什么给了什么?

我们有一个Grails脚本来在PhantomJS中执行JavaScript单元测试(“无头WebKit”)。当这些测试在一个独立的脚本中执行时(称之为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)有关,因为从命令行运行此错误时似乎没有发生此错误。

2 个答案:

答案 0 :(得分:1)

事实证明,这与尝试从我的IDE(IntelliJ IDEA)中运行测试有关,更具体地说,尝试在OS X机器上执行此操作。

解决方案是使用phantomjsPATH添加到launchd.conf。我...

  1. 已创建/etc/launchd.conf
  2. 在其中添加了以下行:(注意:我使用Homebrew安装了PhantomJS)

    setenv PATH /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

  3. 重新启动我的计算机,以便新的launchd配置生效。
  4. 回到我的IDE并重新运行测试。
  5. 所有测试都成功运行。

答案 1 :(得分:0)

您可以尝试使用groovy打印路径

['sh', '-c', 'echo $PATH' ].execute().text

println System.getenv('PATH')

您可以使用phantomjs的绝对路径创建环境变量,并在运行时对其进行验证,并在未正确配置时发出警报。