当前位置:天才代写 > tutorial > JAVA 教程 > 在Ruby on Rails应用措施中重用Java代码

在Ruby on Rails应用措施中重用Java代码

2017-11-11 08:00 星期六 所属: JAVA 教程 浏览:328

副标题#e#

开始之前

关于本教程

Ruby on Rails (Rails) 是用 Ruby 编 写的一个 full-stack Web 应用措施框架,而 Ruby 是一种成果富厚的、免费的 、可扩展的、可移植的、面向工具的剧本体例语言。Rails 在 Web 应用措施开 发人员之间很是风行。通过它,可以快速有效地开拓 Web 应用措施,并将其部 署到任何 Web 容器中,譬喻 IBM® WebSphere® 或 Apache Tomcat。

在 Rails 和雷同的 Web 应用措施开拓框架呈现之前,用于 Web 应用措施开 发的尺度东西是 Java 语言,因为 Java 语言是独立于平台的,而且有完整的 API 集。许多 Java Web 应用措施仍然在运行,这导致许多很是有用的、编写良 好的 Java 代码(在本教程中统称遗留 代码)具有精采的可用性。遗留 Java 代码凡是被打包在一组 JAR 文件。

假如将 Web 应用措施开拓平台改为 Rails,那么可以重用遗留 Java 代码。 Ruby Java Bridge (RJB) 是一个东西包,通过它可以将 JAR 文件装载到 Rails 应用措施中,还可以在 Rail 应用措施中会见个中的要领和变量。本教程表明如 安在 Rails 应用措施中设置和利用 RJB。

方针

在本教程中,您 将进修如何:

下载、编译和安装 RJB

配置 RJB 以会见共享 Java 库

将遗留 Java 代码装载到 Rails 应用措施中并举办会见

本教 程并不深入研究 Rails 的成果。与其他 Web 框架对比,Rails 有许多利益,其 中一个利益就是用于该平台的文档的数量和质量都很高。

先决条件

本教程假设读者根基熟悉 Java 语言、Ruby 和 Ruby on Rails。

系统需求

本教程假设您利用 Linux® 系统(可是,在 Windows® 上的步调根基上是沟通的)。本教程假设您有一个可以事情的 Ruby on Rails。

RJB 要求系统上安装有 Java SDK。假如需要一个 Java SDK,可以针对您的平台下载最新的 Java SE SDK,并顿时安装它。

RJB 安装和配置

本节带您亲历 RJB 的下载、安装、编译和配置。

下 载 RJB

可以下载尺度 Ruby Gem 包或本身编译的源代码归档文件形式的 RJB。为了举办演示,我推荐下载源代码归档文件,所以我将利用这种要领。闲 话少说,此刻就 下载 RJB 1.1.3 source .zip 文件(在撰写本教程之际,已经 有了最新的 RJB 版本)。

确保配置或更新了以下情况变量,它们是安装 RJB 所必须的:

JAVA_HOME 必需指向 Java SDK 安装目次。

PATH 必需包罗 $JAVA_HOME/bin。

譬喻,在 bash(仅用于 Linux 系统)中,假设已经将 Java SDK 安装到 /usr/local/jdk60,则执行以 下呼吁:

[root@san]# export  JAVA_HOME=/usr/local/jdk60

[root@san]# export  PATH=$PATH:$JAVA_HOME/bin

编译和安装 RJB

下一步是通 过执行以下呼吁编译和安装 RJB:

[root@san]# unzip rjb- 1.1.3.zip

[root@san]# cd rjb-1.1.3

[root@san]#  ruby setup.rb config

[root@san]# ruby setup.rb  setup

[root@san]# ruby setup.rb install

确 认安装乐成

为了确认 RJB 安装乐成,首先挪用 Ruby 的交互式节制台 irb:

[root@san]# irb

然后输入 require ‘rjb’:

irb(main):001:0> require  'rjb'

=> true

irb(main):002:0>exit 

假如 require ‘rjb’ 呼吁返回 true,则意味着 Ruby 安装识别 出新安装的 rjb 库。此刻可以在应用措施中开始利用 RJB。


#p#副标题#e#

通过 RJB 利用遗留代码

在本节中,您将在 Rails 应用措施中装载和会见遗留 Java 代码。

示例项目

Java Tar package from ICE Engineering 是用 Java 语言编写的一个很好的东西包,用于处理惩罚归档文件。它提供了 tar 归档实用措施的当地 Java 实现,当与 java.util.zip 包相结适时,它可以处 理 .tar.gz 文件。它还操作 Java 语言的平台独立性,可以不作修改地在所有 UNIX® 变体和 Windows 上运行。作为操练,您将利用它来解压一个样例 tar 文件的内容。通过雷同的要领,可以在 Ruby on Rails 应用措施中利用任 何遗留 Java 代码。

操练的方针是:

将 tar.jar 文件装载到一个 Rails 应用措施中。

将 JAR 文件所需的类装载到应用措施中。

解压利用这些类的样 例 test.tar 文件的内容。

入门

获取样例文件

首先,需 要为系统获取样例 tar 文件(test.tar)和 Java Tar 包:

将 test.tar 下载并生存 到一个利便的位置。

下载和生存 javatar- 2.5.tar.gz。

将 javatar-2.5.tar.gz 的内容解压到一个利便的位置。 这个操练中,这个包中惟一需要用到的文件是 tar.jar,它在 jars 目次中。

会见共享库

RJB 利用 Java Native Interface (JNI) 实现它的 成果。因此,它需要会见 JDK 安装中附带的一些共享工具文件(共享库)。您 必需利用以下呼吁将这些文件的位置添加到 LD_LIBRARY_PATH 情况变量中:

#p#分页标题#e#

[root@san]# export JAVA_HOME=/usr/local/jdk60

[root@san]# export  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$JAVA_HOME/jre/lib/i386

[root@san]# export  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$JAVA_HOME/jre/lib/i386/client

假如规划在独立的 Ruby 剧本中利用 RJB,那么只需在正在处理惩罚的 shell 中 配置这些情况变量。对付您的 Ruby on Rails 应用措施,还必需在 Rails 应用 措施的 environment.rb 文件中配置这些变量。

将 RJB 装载到 Rails 应用措施

要将 RJB 装载到 Rails 应用措施并将它配置为可以挪用 Java 类,需要执 行两个步调:

汇报 Ruby 将 rjb 库包括到代码中。

装载 JVM,配置类路径和其他可选的 JVM 参数。

首先,利用下面的呼吁初始化 RJB:

require ’rjb’

接着,将 Rails 应用措施中将要利用的所有 legacy .jar 文件 — 本例中 为 tar.jar — 添加到 classpath 变量:

Rjb::load(classpath = ’.:/path/to/tar.jar’, jvmargs=[])

可以将 jvmargs 留空,除非但愿为 JVM 指定特另外参数。

此刻,可以将筹备利用的 Java 类导入到 Ruby 中,实例化这些类,并挪用 所需的要领。

#p#副标题#e#

将 Java 类导入到 Ruby 并实例化

清单 1 中的 Ruby 代码从 tar.jar 包中导入了需要的 Java 类,并从导入 的类中建设了 Ruby 工具:

清单 1. 将 Java 类导入到 Ruby 并实例化

tararchive =  Rjb::import('com.ice.tar.TarArchive')

fileinputstream = Rjb::import('java.io.FileInputStream')

file = Rjb::import('java.io.File')

file_instance = file.new_with_sig('Ljava.lang.String;','.')

fileinputstream_instance =
fileinputstream.new_with_sig('Ljava.lang.String;','test.tar')

tararchive_instance =
tararchive.new_with_sig ('Ljava.io.InputStream;',fileinputstream_instance)

p "Let's verify that the objects created are indeed of the  classes we
wanted..."
p "------------------------------"

p "For the File instance...."
p "Expecting: java.io.File , it is: " +  file_instance._classname
p "------------------------------"

p "For the FileInputStream instance...."
p "Expecting: java.io.FileInputStream , it is: " +
fileinputstream_instance._classname
p "------------------------------"

p "For the TarArchive instance...."
p "Expecting: com.ice.tar.TarArchive , it is: " +
tararchive_instance._classname

导入 Java 类

清单 1 中的前三行将挪用 RJB 的 import 要领,将所需的种别离导入到 Ruby 变量 tararchive、fileinputstream 和 file 中。必需指定类的完整包路 径 — 譬喻,TarArchive 类为 com.ice.tar.TarArchive,而 FileInputStream 类为 java.io.FileInputStream — 就像利用 java 呼吁运行应用措施那样。

实例化导入的类

接着,清单 1 建设导入类的工具。可以通过挪用每个类的 new 要领建设类 ,就像建设任何 Ruby 工具一样(譬喻,tararchive.new)。可是这样做会挪用 TarArchive 类的默认的结构函数(没有参数),而您并不但愿这样做。

当重载了类的结构函数后,需要对上面的工具建设要领举办一些修改。在这 种环境下,必需凭据下面的方法建设工具:

object = Classname.new_with_sig(‘signature’, parameter[,more  parameters])

第一个参数界说结构函数所需的参数的签名范例。它汇报 RJB 挪用其输入参 数匹配指定签名的结构函数。

清单 1 中的第 4 个和第 5 个语句别离建设 file 和 fileinputstream 类 的工具,它们挪用相应的结构函数,参数范例为 String。

在清单 1 的第 6 个语句中,TarArchive 类的个中一个结构函数接管 InputStream 范例的工具作为参数。该语句的签名范例是一个单独的 InputStream 输入参数。这些范例签名的具体细节在 getName API 的 Java SDK 文档中做了很好的描写。第二个参数是建设的 InputStream 范例工具。

检讨工具建设

清单 1 中的其余内容将检讨 RJB 建设的工具是否是指定类的工具,要领是 挪用添加到每个工具的 _classname 要领。譬喻,挪用 tararchive_instance._classname 将返回 com.ice.tar.TarArchive,这意味着 类被正确装载,并乐成建设了该类的工具。

#p#副标题#e#

挪用要领并捕捉功效

#p#分页标题#e#

将类装载到 Ruby 并从中建设了工具后,下一步是挪用需要的要领并查察结 果。譬喻,您但愿利用 TarArchive 类的 extractContents 要领,将样例文件 (test.tar)的内容提取到当前目次中。

和结构函数一样,可以利用两种方法挪用要领。一种方法是直接挪用要领, 譬喻:

tararchive_instance.extractContents(file_instance)

当要领重载后,利用 _invoke 挪用指定要领的每个参数的范例签名:

tararchive_instance._invoke('extractContents',  'Ljava.io.File;', file_instance)

这一步可以使 RJB 知道在要领重载时应该挪用哪些要领。

和看待普通 Ruby 代码一样,您将捕捉工具要领返回的功效(假如有的话) ,并在本身的应用措施中利用功效。要领挪用返回的功效被自动转换为相应的对 象范例。您只需在工具内直接挪用要领。

Java TarArchive 类中实现的成果此刻可以用于您的 Ruby 代码。通过利用 沟通的要领,Java 代码中已实现的任何成果可以不加修改地在您的 Ruby 和 Rails 应用措施中重用。

完整的代码

清单 2 展示了本教程示例的完整 Ruby 代码(也可以通过 下载 得到):

清单 2. 完整的示例 Ruby 代码

# Include 'rjb' library  into your application

require 'rjb'

# Load the JVM specifying the jar files to include and  any other optional JVM arguments

Rjb::load(classpath = '.:/path/to/tar.jar', jvmargs=[])

# Import the classes you want to use into a Ruby  variable
# specify the full package path to the classes.

tararchive = Rjb::import('com.ice.tar.TarArchive')
fileinputstream = Rjb::import('java.io.FileInputStream')
file = Rjb::import('java.io.File')

# Create objects of the classes. Use the new method  directly or use
# the 'new_with_sig' call to invoke overloaded constructors  with arguments

# Directory you want to extract the files in this case,  the current directory 

file_instance = file.new_with_sig('Ljava.lang.String;','.')

# inputstream instance of the file to extract 

fileinputstream_instance = fileinputstream.new_with_sig ('Ljava.lang.String;','test.tar')

# tararchive instance of the file to be extracted.

tararchive_instance = tararchive.new_with_sig ('Ljava.io.InputStream;'\
         ,fileinputstream_instance)

# Invoke the method from the class and capture the  results.
# Use either the direct call of the method,
# or the '_invoke' call to invoke overloaded  methods.

p 'Extracting file.....'

tararchive_instance.extractContents(file_instance)

p 'Done...'

实验这些代码,将清单 2 中的代码生存到一个文件中,而且扩展名为 .rb( 或利用 下载 中的 rjb-javatar.rb),然后在 Ruby 表明措施中运行。

竣事语

在全新的 Rails 应用措施中重用已有的遗留 Java 代码其实很是简朴,方法 如下:

安装 Java SDK 和 RJB。

将 JAVA_HOME 和 LD_LIBRARY_PATH 情况变量导出到您的 Rails 应用措施的 environment.rb 文件中。

在应用措施中包罗 rjb 库。

通过指定但愿利用的 JAR 文件,装载 RJB 和 JVM。

从但愿利用的 JAR 文件中将类导入到 Ruby 变量并建设类的工具。

开始在 Rails 应用措施中利用方才建设的类,就像利用任何 Ruby 工具一样 。

假如但愿在 Rails 应用措施中重用已经利用 Java 代码实现的业务逻辑, RJB 很是有用,而且不需要利用 Ruby 从头实现。它同时提供了 Ruby on Rails 和 Java 编程的利益。

思量替代要领

还可以利用一种称为 JRuby 的替代要领,它可以实现与 RJB 沟通的方针。 JRuby 是利用 Java 语言实现的完整的 Ruby 包,使 Ruby 可以或许运行在 JVM 之 上。利用 JRuby,您可以会见所有 Java 库。JRuby 要求安装特定于 JRuby 的 Ruby Gems,因为针对非 Java 的 Ruby 的普通 Ruby Gems 不能与 JRuby 兼容 。

RJB 和 JRuby 各有优缺点。对付 JRuby,Ruby 全部在 JVM 之上运行,每个 Ruby 挪用将颠末 JVM,这将使执行变得很是迟钝。同样,假如已经配置了一个 Rails 应用措施,需要从新开始配置,以便 JRuby 会见 Java 代码。作为原生 Ruby 包,RJB 易于安装,而且可以在已有的 Rails 配置中利用。假如需要在您 的 Rails 应用措施中快速挪用一些 Java 代码片断,那么 RJB 是最好的选择。

#p#分页标题#e#

整体而言,在 Rails 应用措施中重用遗留 Java 代码的本领很是有用。利用 Java 语言实现的设计和编写都很是精采的业务逻辑不会弃捐不消,相反,可以 在新的 Web 应用措施中继承发挥有用的成果。

本文配套源码

 

    关键字:

天才代写-代写联系方式