大家都知道,JRuby可以用 require 来装载 jar 文件,但是似乎很少有人知道有另外两种方法可以完成同样的事情,也很少有人知道(JRuby)底层是如何做的。JRuby官方的 wiki 页面
包含了一组例子以帮助大家学习这些,不过,也许还可以更进一步......
如前所述,在你的ruby应用中装载java类的首要方法是 require 。它的工作方式与对 ruby 文件的装载类似,只是装载目标变成了jar文件,可以用类似下面的代码装载(jar文件中被打包的)java类:
require 'java'
require 'hello_world.jar'
然而,这种方式只是让我们装载jar文件,它不能用于装载存放众多类文件的classes目录。
第二种方式是使用 $CLASSPATH 这个全局变量,这个方式很类似我们在 $LOADPATH 全局变量上增加或者去除路径。这个方法的好处是可以添加一个存放类文件的目录,你可以试试下面的代码
require 'java'
$CLASSPATH << 'hello_world.jar'
$CLASSPATH << 'hello_world_directory'
如果我们想深入了解这两种方法(require和$CLASSPATH),我们将发现,require实际上最终还是把我们要装载的jar文件添加到了 $CLASSPATH 上:
$ irb
jruby-1.6.0.RC2 :001 > require 'java'
=> true
jruby-1.6.0.RC2 :002 > require '/Users/david/dev/jruby/lib/jruby.jar'
=> true
jruby-1.6.0.RC2 :003 > $CLASSPATH
=> ["file:/Users/david/dev/jruby/lib/jruby.jar"]
第三种方法可能是最少被人所知的,在我们使用jruby的环境时,我们可以访问一个叫做JRuby的常量,而在这个常量中,有一些东西可以帮助程序员访问JRuby的运行时环境,在这里,我们能够接触到JRuby进行java类装载的 class loader: JRuby.runtime.jruby_class_loader ,代码示例如下:
require 'java'
F = java.io.File
class_loader = JRuby.runtime.jruby_class_loader
class_loader.add_url(F.new('hello_world_directory').to_url)
class_loader.add_url(F.new('hello_world.jar').to_url)
看看这里的代码
,我们可以发现,当我们将一些东西添加到 $CLASSPATH 常量上去的时候,我们实际上是在将这些东西添加进JRuby的class loader:
@JRubyMethod(name = {"append", "<<"}, required = 1)
public IRubyObject append(IRubyObject obj) {
String ss = obj.convertToString().toString();
try {
URL url = getURL(ss);
getRuntime().getJRubyClassLoader().addURL(url);
} catch (MalformedURLException mue) {
throw getRuntime().newArgumentError(mue.getLocalizedMessage());
}
return this;
}
好了,现在的问题是,我们应该使用哪种方式(去装载java类)呢?对于日常的情况,最好的方式显然是 require——我们使用的大多数java 代码都是被打包成一个jar文件的,而且,这也是我们都知道的语法。如果我们需要的java类文件存放在目录中或者我们有一些很特殊的场景,可能更好的选择是设置 $CLASSPATH ,它也能满足我们的需要,而且我们还不必与url和java方言(指class loader这种很java的东西)打交道,同时,这也是一个我们都知道的语法。最后,第三个方案适合那些需要清晰界定 class loader 的场景中。例如,在Trinidad中,我就用了这个方案,这里,每一个被部署的应用需要装载自己的jar文件,第三个方案可以让我针对每个应用建立新的class loader并保证这些class loader之间是完全隔离的。
分享到:
相关推荐
**JRuby 1.7.8 版本详解** JRuby 是一个开源的、高性能的 Ruby 解释器,它能够将 Ruby 代码编译成 Java 字节码,从而在 Java 虚拟机(JVM)上运行。JRuby 的出现使得 Ruby 开发者能够利用 JVM 的强大功能和丰富的库...
include_class("java.lang.System") System.out.println("hello world") ``` 保存后,在 CMD 中再次运行 `jruby HelloWorld.rb`,如果成功,会显示 "hello world",表明 JRuby 可以调用 Java 类。 **五、常见...
标题“jruby-src-1.0”指的是JRuby的一个特定版本——1.0的源代码。JRuby是一种实现Ruby编程语言的Java版本,它允许在Java平台上运行Ruby代码,同时也支持与Java应用程序进行无缝集成。这个压缩包“jruby-src-1.0....
标题 "org.jruby.rar" 暗示我们正在讨论一个与 JRuby 相关的压缩文件,其中可能包含了 JRuby 的源代码、库文件或者其他相关资源。JRuby 是一种 Java 实现的 Ruby 解释器,它允许 Ruby 代码在 JVM(Java 虚拟机)上...
此外,还需要在Class Path中添加JRuby相关的jar文件,如bsf.jar和jruby.jar,以便jprofiler能够识别和监控JRuby的运行。 在jprofiler的配置中,"Main class or executable JAR"字段填写`org.jruby.Main`,...
JRuby是Java平台上的一个实现,它允许开发者在Java虚拟机(JVM)上运行Ruby编程语言。这个“jruby-bin-1.3.1.zip”压缩包是JRuby的一个早期版本,专为Ruby语言的研发提供必要的工具和环境。在这个版本中,重点是兼容...
jruby安装包 和 jruby的lib库 JRuby是面向Ruby、基于Java虚拟机(JVM)的一种解释程序,它结合了Ruby语言的简易性和功能强大的JVM的执行机制,包括与Java库 全面集成。Rails彻底加快及简化了Web应用的开发,不过它让...
《jRuby on Rails WEB2.0》:将Ruby on Rails融入Java平台的实践指南 《jRuby on Rails WEB2.0》是一部由Ola Bini撰写的书籍,深入探讨了如何将Ruby on Rails这一敏捷开源框架与Java平台相结合,以构建高效、灵活的...
**JRuby:Ruby on Windows的完美融合** JRuby是一个开源的、基于Java平台的Ruby语言实现,它允许开发者在Ruby环境中使用Java类库,并且可以让Java应用程序无缝地调用Ruby代码。标题中的“jruby_windows_1_6_4安装...
jruby-1.3.1.jar包 解决org.jruby.exceptions.JumpException 等报错
JRuby的版本"jruby-jruby-7bee00d"可能是一个特定的Git提交版本,这表明它是一个开发版本,可能包含了最新的功能和改进。通常,这样的版本会包含一些实验性的特性,对于开发者来说,他们可以提前试用新功能并提供...
jruby-complete-1.7.19.jar,java版本的ruby解析器
标题 "jruby-1.5.5+OperaWatir+RSpec" 暗示了这是一个关于使用 JRuby 1.5.5 版本、OperaWatir 和 RSpec 进行自动化测试的项目或者资源集合。现在,我们将深入探讨这三个关键组件以及它们在 IT 领域中的应用。 JRuby...
JRuby window X64 开发软件
**JRuby+Swing:开发桌面应用的利器** JRuby 是一种在 Java 平台上实现的 Ruby 解释器,它允许开发人员通过 Java 虚拟机(JVM)执行 Ruby 代码。JRuby 的独特之处在于其能够无缝地集成 Java 库,包括 Java Swing,...
标题 "jruby-core-1.7.12.zip" 提供的是 JRuby 的核心库版本 1.7.12,这是一个将 Java 虚拟机(JVM)与 Ruby 语言结合的开源实现。JRuby 允许开发者在 Java 平台上运行 Ruby 代码,同时利用 Java 生态系统的强大功能...
jruby 1.9.6 win64