为什么我不能在Ruby中使用Backquotes / Backticks方法调用javac?

我试图通过Ruby脚本编译java源文件。 但是我对以下行为感到有些困惑

compile_results = `javac #{source_file}` 

这无法运行’没有这样的文件…’错误。 我突然出现了

 irb(main):001:0> `javac -help` Errno::ENOENT: No such file or directory - javac -help from (irb):1:in ``' from (irb):1 irb(main):002:0> `csc` => "Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.3053\nfor Microsoft (R) Windows (R) 2005 Framework version 2.0.50727\nCopyright (C) Microsoft Corpo ration 2001-2005. All rights reserved.\n\nfatal error CS2008: No inputs specifie d\n" 

然而,javac和csc都在PATH上。 例如,如果我从我运行ruby脚本的shell手动运行javac,我就可以进入java编译器。 源文件存在。

我尝试了ruby 1.8.7和1.9.1(Windows)。 有没有人看到我失踪的东西?

更新:我不认为它与命令行args有关。 相反,它出于一些奇怪的原因无法进入javac。 我将行javac %1放在批处理文件中,并以通常的方式调用批处理文件。 这有效…但仍然不确定javac的整个问题是什么。

两者之间的明显区别在于您没有使用参数运行csc

只是为了更接近解决方案,编写一个JavaHelp.bat (如果您愿意,还可以使用.cmd ),将其放在路径上并从ruby中调用它。

您可以尝试的另一件事是将java显式调用为javac.exe 。 不过,我对此没有太大的希望,因为没有.exe csc也可以。

最后,您可以尝试插入自己的shell:尝试类似的东西

cmd /c javac -help

(在这一切中,我假设你在Windows上)。

似乎Ruby on Windows不喜欢

 `command -with-args` 

句法。 你可以试试

 %x[javac -help] 

要么

 %x[javac #{source_file}] 

要么

 system 'javac', '-help' 

要么

 system 'javac', "#{source_file}" 

Javac可能在你的shell的路径中,但就这个实例中的Ruby而言,它并非如此。 Csc显然在你的道路上,并给你错误,但javac没有。

如果你只是运行javac它会给你相同的ENOENT吗? 如果是这样,那只是路径问题。 Ruby中的环境完全可能与shell中的环境不同。 您可以打印出您的环境并确保路径实际上是正确的吗?

最后,我不知道他们是否还在使用它,我已经很久没用过java了,但是java有不同的路径系统吗? 我似乎记得你必须设置JAVA_HOME或其他东西而不是路径(或者除了路径失败之外?)。

自从我上次使用Windows以来已经有一段时间了,如果这些都是死路一条道歉。

改为:

 `C:/java_location/bin/javac.exe arguments` 

并将C:/Java_location替换为JDK的实际位置。 这应该有效,您不需要额外的批处理文件。

以下是几个可能的原因:

  1. source_file在其名称或路径中的某处有空格。 引用javac的参数。
  2. source_file是一个相对路径,但是您无法从当前工作目录到达该相对路径。