大家都知道,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是一个ruby的解析器,可将ruby解析为java文件,jruby作为ruby解析器时刻调用java代码
jruby安装包 和 jruby的lib库 JRuby是面向Ruby、基于Java虚拟机(JVM)的一种解释程序,它结合了Ruby语言的简易性和功能强大的JVM的执行机制,包括与Java库 全面集成。Rails彻底加快及简化了Web应用的开发,不过它让...
See how JRuby fits into the enterprise by switching your app to use TorqueBox, an all-in-one JRuby environment that includes built-in support for messaging, scheduling, and daemons--perfect for ...
jruby-src-1.0.zip
jruby-1.3.1.jar包 解决org.jruby.exceptions.JumpException 等报错
本文介绍了JRuby的安装与配置。JRuby的安装需要JRuby以及JDK,本文使用的版本分别是JRuby 1.1.2以及Java 1.6。至于JRuby配置,文章主要介绍了测试JRuby安装的方法。
org.jruby.rar
jruby-complete-1.7.19.jar,java版本的ruby解析器
Now you can bring the best of Ruby into the world of Java, with Using JRuby.... See how to compile Ruby into .class files that are callable from Java, Scala, Clojure, or any other JVM language.
jruby-bin-1.3.1.zip 用于jruby语言研发的必要工具
JRuby window X64 开发软件
jRuby On Rails WEB 2.0
JRuby语言实战技术,java下运用ruby
jruby 1.9.6 win64
JRuby在Java测试中的应用,使用脚本语言,高效快进行Java程序测试。
jruby-1.5.5+OperaWatir+RSpec
jruby与java使用开发,听说jruby能是swing的调用变为更简单
对于Jruby、Jython和Groovy三种动态语言,长期以来很多人犹豫于如何选择它们。本文提出一个非常有力的例证证明:如果你是一个基于Java虚拟机的开发者,那么请放弃Jruby和Jython。
使用 JRuby Servlet 进行异步请求处理 该项目演示了如何在 Servlet 3.1 和 JRuby 中使用非阻塞 IO ...rm -f jruby-async-servlets-example.war Creating jruby-async-servlets-example.war $ java -jar jruby-async-ser
Ruby 、 Rails 、JRuby 都是令人兴奋的技术