`
fsword
  • 浏览: 168172 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[翻译] JRuby class loader by example

 
阅读更多

大家都知道,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之间是完全隔离的。

 

0
1
分享到:
评论

相关推荐

    jruby1.7.8版本呢

    **JRuby 1.7.8 版本详解** JRuby 是一个开源的、高性能的 Ruby 解释器,它能够将 Ruby 代码编译成 Java 字节码,从而在 Java 虚拟机(JVM)上运行。JRuby 的出现使得 Ruby 开发者能够利用 JVM 的强大功能和丰富的库...

    如何安装与配置JRuby

    include_class("java.lang.System") System.out.println("hello world") ``` 保存后,在 CMD 中再次运行 `jruby HelloWorld.rb`,如果成功,会显示 "hello world",表明 JRuby 可以调用 Java 类。 **五、常见...

    jruby-src-1.0

    标题“jruby-src-1.0”指的是JRuby的一个特定版本——1.0的源代码。JRuby是一种实现Ruby编程语言的Java版本,它允许在Java平台上运行Ruby代码,同时也支持与Java应用程序进行无缝集成。这个压缩包“jruby-src-1.0....

    org.jruby.rar

    标题 "org.jruby.rar" 暗示我们正在讨论一个与 JRuby 相关的压缩文件,其中可能包含了 JRuby 的源代码、库文件或者其他相关资源。JRuby 是一种 Java 实现的 Ruby 解释器,它允许 Ruby 代码在 JVM(Java 虚拟机)上...

    如何监控JRuby脚本的执行

    此外,还需要在Class Path中添加JRuby相关的jar文件,如bsf.jar和jruby.jar,以便jprofiler能够识别和监控JRuby的运行。 在jprofiler的配置中,"Main class or executable JAR"字段填写`org.jruby.Main`,...

    jruby-bin-1.3.1.zip

    JRuby是Java平台上的一个实现,它允许开发者在Java虚拟机(JVM)上运行Ruby编程语言。这个“jruby-bin-1.3.1.zip”压缩包是JRuby的一个早期版本,专为Ruby语言的研发提供必要的工具和环境。在这个版本中,重点是兼容...

    jruby_windows1.7and bin1.7

    jruby安装包 和 jruby的lib库 JRuby是面向Ruby、基于Java虚拟机(JVM)的一种解释程序,它结合了Ruby语言的简易性和功能强大的JVM的执行机制,包括与Java库 全面集成。Rails彻底加快及简化了Web应用的开发,不过它让...

    jRuby On Rails WEB2.0

    《jRuby on Rails WEB2.0》:将Ruby on Rails融入Java平台的实践指南 《jRuby on Rails WEB2.0》是一部由Ola Bini撰写的书籍,深入探讨了如何将Ruby on Rails这一敏捷开源框架与Java平台相结合,以构建高效、灵活的...

    jruby_windows_1_6_4安装文件

    **JRuby:Ruby on Windows的完美融合** JRuby是一个开源的、基于Java平台的Ruby语言实现,它允许开发者在Ruby环境中使用Java类库,并且可以让Java应用程序无缝地调用Ruby代码。标题中的“jruby_windows_1_6_4安装...

    jruby-1.3.1.jar

    jruby-1.3.1.jar包 解决org.jruby.exceptions.JumpException 等报错

    Ruby-JRuby一个Ruby语言的Java实现

    JRuby的版本"jruby-jruby-7bee00d"可能是一个特定的Git提交版本,这表明它是一个开发版本,可能包含了最新的功能和改进。通常,这样的版本会包含一些实验性的特性,对于开发者来说,他们可以提前试用新功能并提供...

    jruby-complete-1.7.19.jar

    jruby-complete-1.7.19.jar,java版本的ruby解析器

    jruby-1.5.5+OperaWatir+RSpec

    标题 "jruby-1.5.5+OperaWatir+RSpec" 暗示了这是一个关于使用 JRuby 1.5.5 版本、OperaWatir 和 RSpec 进行自动化测试的项目或者资源集合。现在,我们将深入探讨这三个关键组件以及它们在 IT 领域中的应用。 JRuby...

    JRuby window X64 开发软件

    JRuby window X64 开发软件

    JRuby+Swing是开发人员钟情的选择

    **JRuby+Swing:开发桌面应用的利器** JRuby 是一种在 Java 平台上实现的 Ruby 解释器,它允许开发人员通过 Java 虚拟机(JVM)执行 Ruby 代码。JRuby 的独特之处在于其能够无缝地集成 Java 库,包括 Java Swing,...

    jruby-core-1.7.12.zip

    标题 "jruby-core-1.7.12.zip" 提供的是 JRuby 的核心库版本 1.7.12,这是一个将 Java 虚拟机(JVM)与 Ruby 语言结合的开源实现。JRuby 允许开发者在 Java 平台上运行 Ruby 代码,同时利用 Java 生态系统的强大功能...

    jruby 1.9.6 win64

    jruby 1.9.6 win64

Global site tag (gtag.js) - Google Analytics