'require“java”'语句在JRuby脚本中做了什么?

时间:2016-02-10 22:46:36

标签: java ruby jruby

我读到了Ruby中的Java互操作性,因此使用JRuby是一个明显的选择。但不知怎的,我并没有真正理解require 'java'背后的想法。文档说:

  

...将允许您访问任何捆绑的Java库(java类路径中的类)。但是,这不会授予您访问任何非捆绑库的权限。

有没有更详细的解释?

更准确地说,我不明白为什么以下代码在没有require "java"的情况下工作:

$ export CLASSPATH=".:lib/opennlp-tools-1.6.0.jar" $ jruby -e 't = Java::OpennlpToolsTokenize::SimpleTokenizer.new; puts t.tokenize("I went to school").to_a'

1 个答案:

答案 0 :(得分:1)

这个问题有两个部分需要回答,我们应该对文档做一些澄清(我已经在https://github.com/jruby/jruby/wiki/CallingJavaFromJRuby中进行了尝试):

  1. 需要'java'。它加载了加载java类的能力,并将它们视为Ruby对象/类。但是,从JRuby 1.7.x开始,JRuby内部需要'java',因此在评估表达式时它已经需要'java'。从技术上来说,“require'java'”确实加载了Java互操作性,但是由于我们的内核现在这样做,所以当你调用它时它主要是一个无操作(参见require的返回值)。我们仍然建议将它放在使用Java互操作的任何文件的顶部。只是因此它在您的代码中记录。此外,它恰好被加载的事实更多的是细节,而不是语义细节(例如,在遥远的未来,我们可能不会在我们的内核中需要它。)

  2. 不清楚的措辞:“但是,这不会让您访问任何非捆绑的库。”因此,如果您想访问不在CLASSPATH中的库(这在括号中规定),您需要将它们添加到LOAD_PATH(或通过直接require'ing)。我调整了这句话,希望能让它更清晰。