【问题标题】:Why can't I call javac using the Backquotes/Backticks approach in Ruby?为什么我不能在 Ruby 中使用反引号/反引号方法调用 javac?
【发布时间】:2009-11-24 12:45:40
【问题描述】:

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

compile_results = `javac  #{source_file}`

运行失败并出现“没有这样的文件...”错误。我弹出了irb

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)。有人看到我缺少的东西吗?

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

【问题讨论】:

    标签: ruby scripting


    【解决方案1】:

    两者之间的一个明显区别是您运行 csc 时没有带参数。

    为了更接近解决方案,写一个JavaHelp.bat(或.cmd,如果你愿意),把它放在路径上并从ruby调用它。

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

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

    cmd /c javac -help

    (在所有这些中,我假设您使用的是 Windows)。

    【讨论】:

    • 是的,委托批处理文件也是我想出的。就在我睡觉之前 :) 它也确实有效。但仍然不确定这个问题的根本原因。
    【解决方案2】:

    Windows 上的 Ruby 似乎不喜欢

    `command -with-args`
    

    语法。你可以试试

    %x[javac -help]
    

    %x[javac #{source_file}]
    

    system 'javac', '-help'
    

    system 'javac', "#{source_file}"
    

    【讨论】:

      【解决方案3】:

      Javac 可能在您的 shell 路径中,但就本例中的 Ruby 而言,它不是。 Csc 显然在您的路径中,并给您应有的错误,但 javac 没有。

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

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

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

      【讨论】:

      • 不,不再需要 JAVA_HOME。一些 Java 程序喜欢看到它,但 Java(java、javac、javaw)会很高兴地挖掘出可执行文件的路径并从那里推断其库的位置。
      【解决方案4】:

      改为这样做:

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

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

      【讨论】:

        【解决方案5】:

        这里有几个可能的原因:

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

        【讨论】:

        • 没有。 “-help”不包含空格。不,如果 javac 在路径上,那么它是可访问的。
        猜你喜欢
        • 2021-11-29
        • 2011-08-25
        • 2011-09-22
        • 1970-01-01
        • 2016-07-13
        • 2021-08-07
        相关资源
        最近更新 更多