Welcome 微信登录

首页 / 软件开发 / JAVA / 使用Java Web Start部署JRuby应用

使用Java Web Start部署JRuby应用2011-02-13你通常需要一个命令来进入Ruby和Java的联合世界:

include Java

这使你可以实例化Java类,调用其方法,甚至继承它们,就好象它们仅仅是普通的Ruby对象一样。但这其中有一些微妙的差异,这篇文章将向你展示如何管理它们以便能以最快的速度设计出新的应用并部署到你的客户那里。

这篇文章基于一个简单的应用,该应用使用JRuby和Swing实现了一个简单的ObjectSpace浏览器。Ruby的ObjectSpace特性提供了一种方式来访问系统中所有对象。例如,我们可以这样打印所有使用中的字符串:

ObjectSpace.each_object(String) do |string|
puts string
end

当该程序在我的irb会话中运行时,大约会产生28000个字符串。通过使用Swing和JRuby,我们可以把不同的类显示在一个非常棒的图形界面上,包括它们的实例以及可用的方法。你甚至可以在最右边的面板中点击它们来调用无参的方法:

JRuby的ObjectSpace支持在默认情况下是被禁用的,这是由于它在运行时所产生的性能问题,当然还有其他原因。

我要指出它在实现中的一些有趣的细节,并就如何开始使用JRuby中的Java集成特性给出一些提示。

Java集成

一旦你将Java集成到脚本中,你就可以继承现有的Java类。我们只需要通过指定Java类的完整限定名就可以做到这一点。在这个例子应用中,主窗口继承了JFrame。该类中还包含进了javax.swing和java.awt包,所以你不必每次都使用类的全名。

class MainWindow < javax.swing.JFrame
include_package "javax.swing"
include_package "java.awt" ...

做为另外一种选择,你还可以使用include_class功能包含指定的类,这样就不会因你没有使用某些类,而污染了名称空间。

调用父类的构造方法就和普通的Ruby代码一样,这意味着我们可以在initialize方法的第一行通过调用super("JRuby Object Browser")来设定窗口的标题。

因为类包含了整个javax.swing包,所以实例化Java类就变得非常直接:

list_panel = JPanel.new
list_panel.layout = GridLayout.new(0, 3)

如果你仔细看看第二行,你可能会觉得我们直接访问了JPanel的layout属性,但事实并非如此。JRuby为Java对象增加了一些便捷的方法,所以上面的语句也可以用我们熟知的方式编写:

list_panel.setLayout(GridLayout.new(0, 3))