为什么我不能在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的实际位置。 这应该有效,您不需要额外的批处理文件。
以下是几个可能的原因:
- source_file在其名称或路径中的某处有空格。 引用javac的参数。
- source_file是一个相对路径,但是您无法从当前工作目录到达该相对路径。