'require "java"' 语句在 JRuby 脚本中的作用是什么?

What does the 'require "java"' statement do in JRuby scripts?

我在 Ruby 中了解到 Java 互操作性,因此使用 JRuby 是显而易见的选择。但不知何故,我并没有真正理解 require 'java' 背后的想法。文档说:

... will give you access to any bundled Java libraries (classes within your java class path). However, this will not give you access to any non-bundled libraries.

有更详细的解释吗?

更准确地说,我不明白为什么下面的代码在没有 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'

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

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

  2. 措辞不明确:"However, this will not give you access to any non-bundled libraries."。因此,如果您想访问不在您的 CLASSPATH 中的库(这在括号中有规定),您需要将它们添加到您的 LOAD_PATH(或通过直接要求)。我调整了那句话,希望能更清楚。