激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Ruby - 利用RJB在Ruby on Rails中使用Java代碼的教程

利用RJB在Ruby on Rails中使用Java代碼的教程

2020-04-25 14:35腳本之家 Ruby

這篇文章主要介紹了利用RJB在Ruby on Rails中使用Java代碼的教程,本文來自于IBM官方網(wǎng)站技術(shù)文檔,需要的朋友可以參考下

開始之前
關(guān)于本教程

Ruby on Rails (Rails) 是用 Ruby 編寫的一個(gè) full-stack Web 應(yīng)用程序框架,而 Ruby 是一種功能豐富的、免費(fèi)的、可擴(kuò)展的、可移植的、面向?qū)ο蟮哪_本編制語言。Rails 在 Web 應(yīng)用程序開發(fā)人員之間非常流行。通過它,可以快速有效地開發(fā) Web 應(yīng)用程序,并將其部署到任何 Web 容器中,例如 IBM? WebSphere? 或 Apache Tomcat。

在 Rails 和類似的 Web 應(yīng)用程序開發(fā)框架出現(xiàn)之前,用于 Web 應(yīng)用程序開發(fā)的標(biāo)準(zhǔn)工具是 Java 語言,因?yàn)?Java 語言是獨(dú)立于平臺(tái)的,并且有完整的 API 集。很多 Java Web 應(yīng)用程序仍然在運(yùn)行,這導(dǎo)致很多非常有用的、編寫良好的 Java 代碼(在本教程中統(tǒng)稱遺留 代碼)具有良好的可用性。遺留 Java 代碼通常被打包在一組 JAR 文件。

如果將 Web 應(yīng)用程序開發(fā)平臺(tái)改為 Rails,那么可以重用遺留 Java 代碼。Ruby Java Bridge (RJB) 是一個(gè)工具包,通過它可以將 JAR 文件裝載到 Rails 應(yīng)用程序中,還可以在 Rail 應(yīng)用程序中訪問其中的方法和變量。本教程解釋如何在 Rails 應(yīng)用程序中配置和使用 RJB。
目標(biāo)

在本教程中,您將學(xué)習(xí)如何:

  •     下載、編譯和安裝 RJB
  •     設(shè)置 RJB 以訪問共享 Java 庫
  •     將遺留 Java 代碼裝載到 Rails 應(yīng)用程序中并進(jìn)行訪問

本教程并不深入研究 Rails 的功能。與其他 Web 框架相比,Rails 有很多優(yōu)點(diǎn),其中一個(gè)優(yōu)點(diǎn)就是用于該平臺(tái)的文檔的數(shù)量和質(zhì)量都很高(參見參考資料)。
先決條件

本教程假設(shè)讀者基本熟悉 Java 語言、Ruby 和 Ruby on Rails。
系統(tǒng)需求

本教程假設(shè)您使用 Linux? 系統(tǒng)(但是,在 Windows? 上的步驟基本上是相同的)。本教程假設(shè)您有一個(gè)可以工作的 Ruby on Rails。如果還沒有,請(qǐng)?jiān)?參考資料 小節(jié)中找到相關(guān)文檔的鏈接,以幫助您在自己的系統(tǒng)上安裝和配置 Rails。

RJB 要求系統(tǒng)上安裝有 Java SDK。如果需要一個(gè) Java SDK,可以針對(duì)您的平臺(tái)下載最新的 Java SE SDK,并馬上安裝它。

RJB 安裝和設(shè)置

本節(jié)帶您親歷 RJB 的下載、安裝、編譯和設(shè)置。
下載 RJB

可以下載標(biāo)準(zhǔn) Ruby Gem 包或自己編譯的源代碼歸檔文件形式的 RJB。為了進(jìn)行演示,我推薦下載源代碼歸檔文件,所以我將使用這種方法。閑話少說,現(xiàn)在就 下載 RJB 1.1.3 source .zip 文件(在撰寫本教程之際,已經(jīng)有了最新的 RJB 版本)。

確保設(shè)置或更新了以下環(huán)境變量,它們是安裝 RJB 所必需的:

  •     JAVA_HOME 必須指向 Java SDK 安裝目錄。
  •     PATH 必須包括 $JAVA_HOME/bin。

例如,在 bash(僅用于 Linux 系統(tǒng))中,假設(shè)已經(jīng)將 Java SDK 安裝到 /usr/local/jdk60,則執(zhí)行以下命令:

?
1
2
3
[root@san]# export JAVA_HOME=/usr/local/jdk60
 
[root@san]# export PATH=$PATH:$JAVA_HOME/bin

編譯和安裝 RJB

下一步是通過執(zhí)行以下命令編譯和安裝 RJB:

?
1
2
3
4
5
6
7
8
9
[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

確認(rèn)安裝成功

為了確認(rèn) RJB 安裝成功,首先調(diào)用 Ruby 的交互式控制臺(tái) irb:

?
1
[root@san]# irb

然后輸入 require 'rjb':

?
1
2
3
4
5
irb(main):001:0> require 'rjb'
 
=> true
 
irb(main):002:0>exit

如果 require 'rjb' 命令返回 true,則意味著 Ruby 安裝識(shí)別出新安裝的 rjb 庫。現(xiàn)在可以在應(yīng)用程序中開始使用 RJB。

通過 RJB 使用遺留代碼

在本節(jié)中,您將在 Rails 應(yīng)用程序中裝載和訪問遺留 Java 代碼。
示例項(xiàng)目

Java Tar package from ICE Engineering 是用 Java 語言編寫的一個(gè)很好的工具包,用于處理歸檔文件。它提供了 tar 歸檔實(shí)用程序的本地 Java 實(shí)現(xiàn),當(dāng)與 java.util.zip 包相結(jié)合時(shí),它可以處理 .tar.gz 文件。它還利用 Java 語言的平臺(tái)獨(dú)立性,可以不作修改地在所有 UNIX? 變體和 Windows 上運(yùn)行。作為練習(xí),您將使用它來解壓一個(gè)樣例 tar 文件的內(nèi)容。通過類似的方法,可以在 Ruby on Rails 應(yīng)用程序中使用任何遺留 Java 代碼。

練習(xí)的目標(biāo)是:

  •     將 tar.jar 文件裝載到一個(gè) Rails 應(yīng)用程序中。
  •     將 JAR 文件所需的類裝載到應(yīng)用程序中。
  •     解壓使用這些類的樣例 test.tar 文件的內(nèi)容。

入門
獲取樣例文件

首先,需要為系統(tǒng)獲取樣例 tar 文件(test.tar)和 Java Tar 包:

  •     將test.tar 下載并保存 到一個(gè)方便的位置。
  •     下載和保存javatar-2.5.tar.gz
  •     將 javatar-2.5.tar.gz 的內(nèi)容解壓到一個(gè)方便的位置。這個(gè)練習(xí)中,這個(gè)包中惟一需要用到的文件是 tar.jar,它在 jars 目錄中。

訪問共享庫

RJB 使用 Java Native Interface (JNI) 實(shí)現(xiàn)它的功能。因此,它需要訪問 JDK 安裝中附帶的一些共享對(duì)象文件(共享庫)。您必須使用以下命令將這些文件的位置添加到 LD_LIBRARY_PATH 環(huán)境變量中:

?
1
2
3
4
5
[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

如果打算在獨(dú)立的 Ruby 腳本中使用 RJB,那么只需在正在處理的 shell 中設(shè)置這些環(huán)境變量。對(duì)于您的 Ruby on Rails 應(yīng)用程序,還必須在 Rails 應(yīng)用程序的 environment.rb 文件中設(shè)置這些變量。
將 RJB 裝載到 Rails 應(yīng)用程序

要將 RJB 裝載到 Rails 應(yīng)用程序并將它設(shè)置為可以調(diào)用 Java 類,需要執(zhí)行兩個(gè)步驟:

  1.     告訴 Ruby 將 rjb 庫包含到代碼中。
  2.     裝載 JVM,設(shè)置類路徑和其他可選的 JVM 參數(shù)。

首先,使用下面的命令初始化 RJB:

?
1
require 'rjb'

接著,將 Rails 應(yīng)用程序中將要使用的所有 legacy .jar 文件 — 本例中為 tar.jar — 添加到 classpath 變量:

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

可以將 jvmargs 留空,除非希望為 JVM 指定額外的參數(shù)。

現(xiàn)在,可以將準(zhǔn)備使用的 Java 類導(dǎo)入到 Ruby 中,實(shí)例化這些類,并調(diào)用所需的方法。
將 Java 類導(dǎo)入到 Ruby 并實(shí)例化

清單 1 中的 Ruby 代碼從 tar.jar 包中導(dǎo)入了需要的 Java 類,并從導(dǎo)入的類中創(chuàng)建了 Ruby 對(duì)象:
清單 1. 將 Java 類導(dǎo)入到 Ruby 并實(shí)例化

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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

導(dǎo)入 Java 類

清單 1 中的前三行將調(diào)用 RJB 的 import 方法,將所需的類分別導(dǎo)入到 Ruby 變量 tararchive、fileinputstream 和 file 中。必須指定類的完整包路徑 — 例如,TarArchive 類為 com.ice.tar.TarArchive,而 FileInputStream 類為 java.io.FileInputStream— 就像使用 java 命令運(yùn)行應(yīng)用程序那樣。
實(shí)例化導(dǎo)入的類

接著,清單 1 創(chuàng)建導(dǎo)入類的對(duì)象。可以通過調(diào)用每個(gè)類的 new 方法創(chuàng)建類,就像創(chuàng)建任何 Ruby 對(duì)象一樣(例如,tararchive.new)。但是這樣做會(huì)調(diào)用 TarArchive 類的默認(rèn)的構(gòu)造函數(shù)(沒有參數(shù)),而您并不希望這樣做。

當(dāng)重載了類的構(gòu)造函數(shù)后,需要對(duì)上面的對(duì)象創(chuàng)建方法進(jìn)行一些修改。在這種情況下,必須按照下面的方式創(chuàng)建對(duì)象:

?
1
object = Classname.new_with_sig('signature', parameter[,more parameters])

第一個(gè)參數(shù)定義構(gòu)造函數(shù)所需的參數(shù)的簽名類型。它告訴 RJB 調(diào)用其輸入?yún)?shù)匹配指定簽名的構(gòu)造函數(shù)。

清單 1 中的第 4 個(gè)和第 5 個(gè)語句分別創(chuàng)建 file 和 fileinputstream 類的對(duì)象,它們調(diào)用相應(yīng)的構(gòu)造函數(shù),參數(shù)類型為 String。

在清單 1 的第 6 個(gè)語句中,TarArchive 類的其中一個(gè)構(gòu)造函數(shù)接受 InputStream 類型的對(duì)象作為參數(shù)。該語句的簽名類型是一個(gè)單獨(dú)的 InputStream 輸入?yún)?shù)。這些類型簽名的詳細(xì)細(xì)節(jié)在 getName API 的 Java SDK 文檔中做了很好的描述(參見 參考資料)。第二個(gè)參數(shù)是創(chuàng)建的 InputStream 類型對(duì)象。
檢驗(yàn)對(duì)象創(chuàng)建

清單 1 中的其余內(nèi)容將檢驗(yàn) RJB 創(chuàng)建的對(duì)象是否是指定類的對(duì)象,方法是調(diào)用添加到每個(gè)對(duì)象的 _classname 方法。例如,調(diào)用 tararchive_instance._classname 將返回 com.ice.tar.TarArchive,這意味著類被正確裝載,并成功創(chuàng)建了該類的對(duì)象。
調(diào)用方法并捕獲結(jié)果

將類裝載到 Ruby 并從中創(chuàng)建了對(duì)象后,下一步是調(diào)用需要的方法并查看結(jié)果。例如,您希望使用 TarArchive 類的 extractContents 方法,將樣例文件(test.tar)的內(nèi)容提取到當(dāng)前目錄中。

和構(gòu)造函數(shù)一樣,可以使用兩種方式調(diào)用方法。一種方式是直接調(diào)用方法,例如:

?
1
tararchive_instance.extractContents(file_instance)

當(dāng)方法重載后,使用 _invoke 調(diào)用指定方法的每個(gè)參數(shù)的類型簽名:

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

這一步可以使 RJB 知道在方法重載時(shí)應(yīng)該調(diào)用哪些方法。

和對(duì)待普通 Ruby 代碼一樣,您將捕獲對(duì)象方法返回的結(jié)果(如果有的話),并在自己的應(yīng)用程序中使用結(jié)果。方法調(diào)用返回的結(jié)果被自動(dòng)轉(zhuǎn)換為相應(yīng)的對(duì)象類型。您只需在對(duì)象內(nèi)直接調(diào)用方法。

Java TarArchive 類中實(shí)現(xiàn)的功能現(xiàn)在可以用于您的 Ruby 代碼。通過使用相同的方法,Java 代碼中已實(shí)現(xiàn)的任何功能可以不加修改地在您的 Ruby 和 Rails 應(yīng)用程序中重用。
完整的代碼

清單 2 展示了本教程示例的完整 Ruby 代碼(也可以通過 下載 獲得):
清單 2. 完整的示例 Ruby 代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 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 中的代碼保存到一個(gè)文件中,并且擴(kuò)展名為 .rb(或使用 下載 中的 rjb-javatar.rb),然后在 Ruby 解釋程序中運(yùn)行。

結(jié)束語

在全新的 Rails 應(yīng)用程序中重用已有的遺留 Java 代碼其實(shí)非常簡(jiǎn)單,方式如下:

  •     安裝 Java SDK 和 RJB。
  •     將 JAVA_HOME 和 LD_LIBRARY_PATH 環(huán)境變量導(dǎo)出到您的 Rails 應(yīng)用程序的 environment.rb 文件中。
  •     在應(yīng)用程序中包括 rjb 庫。
  •     通過指定希望使用的 JAR 文件,裝載 RJB 和 JVM。
  •     從希望使用的 JAR 文件中將類導(dǎo)入到 Ruby 變量并創(chuàng)建類的對(duì)象。
  •     開始在 Rails 應(yīng)用程序中使用剛剛創(chuàng)建的類,就像使用任何 Ruby 對(duì)象一樣。

如果希望在 Rails 應(yīng)用程序中重用已經(jīng)使用 Java 代碼實(shí)現(xiàn)的業(yè)務(wù)邏輯,RJB 非常有用,并且不需要使用 Ruby 重新實(shí)現(xiàn)。它同時(shí)提供了 Ruby on Rails 和 Java 編程的優(yōu)點(diǎn)。
考慮替代方法

還可以使用一種稱為 JRuby 的替代方法,它可以實(shí)現(xiàn)與 RJB 相同的目標(biāo)。JRuby 是使用 Java 語言實(shí)現(xiàn)的完整的 Ruby 包,使 Ruby 能夠運(yùn)行在 JVM 之上(參見參考資料)。使用 JRuby,您可以訪問所有 Java 庫。JRuby 要求安裝特定于 JRuby 的 Ruby Gems,因?yàn)獒槍?duì)非 Java 的 Ruby 的普通 Ruby Gems 不能與 JRuby 兼容。

RJB 和 JRuby 各有優(yōu)缺點(diǎn)。對(duì)于 JRuby,Ruby 全部在 JVM 之上運(yùn)行,每個(gè) Ruby 調(diào)用將經(jīng)過 JVM,這將使執(zhí)行變得非常緩慢。同樣,如果已經(jīng)設(shè)置了一個(gè) Rails 應(yīng)用程序,需要從頭開始設(shè)置,以便 JRuby 訪問 Java 代碼。作為原生 Ruby 包,RJB 易于安裝,并且可以在已有的 Rails 設(shè)置中使用。如果需要在您的 Rails 應(yīng)用程序中快速調(diào)用一些 Java 代碼片段,那么 RJB 是最好的選擇。

整體而言,在 Rails 應(yīng)用程序中重用遺留 Java 代碼的能力非常有用。使用 Java 語言實(shí)現(xiàn)的設(shè)計(jì)和編寫都非常良好的業(yè)務(wù)邏輯不會(huì)擱置不用,相反,可以在新的 Web 應(yīng)用程序中繼續(xù)發(fā)揮有用的功能。

延伸 · 閱讀

精彩推薦
  • RubyRuby環(huán)境下安裝使用bundler來管理多版本的gem

    Ruby環(huán)境下安裝使用bundler來管理多版本的gem

    這篇文章主要介紹了Ruby環(huán)境下安裝使用bundler來管理多版本的gem的方法,舉了Ruby On Rails中的應(yīng)用實(shí)例來進(jìn)行演示,需要的朋友可以參考下 ...

    日拱一卒4332020-05-10
  • RubyCentOS中配置Ruby on Rails環(huán)境

    CentOS中配置Ruby on Rails環(huán)境

    經(jīng)過一個(gè)上午的折騰,終于把ROR環(huán)境在CentOS中搞定,繞了很多彎路,把文章寫下來總結(jié)一下 ...

    可樂加糖4762020-04-12
  • RubyRuby簡(jiǎn)潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類和對(duì)象

    Ruby簡(jiǎn)潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類和對(duì)象

    這篇文章主要介紹了Ruby簡(jiǎn)潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類和對(duì)象,本文是學(xué)習(xí)筆記第一篇,需要的朋友可以參考下 ...

    腳本之家2472020-04-20
  • RubyRuby迭代器的7種技巧分享

    Ruby迭代器的7種技巧分享

    這篇文章主要介紹了Ruby迭代器的7種技巧分享,Ruby中的迭代器非常人性化,本文既是講解了7個(gè)技巧也是講解了7種迭代器,需要的朋友可以參考下 ...

    腳本之家4782020-04-20
  • RubyRuby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例

    Ruby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例

    這篇文章主要介紹了Ruby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例,建造者模式將一個(gè)復(fù)雜對(duì)象的構(gòu)造與它的表示分離,使同樣的構(gòu)建過程可以創(chuàng)建不同的表...

    范孝鵬2192020-05-07
  • RubyRuby進(jìn)行文件信息輸出實(shí)例代碼

    Ruby進(jìn)行文件信息輸出實(shí)例代碼

    Ruby進(jìn)行文件信息輸出實(shí)例代碼,數(shù)據(jù)是隨機(jī)的,所以每次的記錄都會(huì)不同。 ...

    ruby教程網(wǎng)2962020-04-10
  • Ruby剖析 Ruby 訪問控制

    剖析 Ruby 訪問控制

    前面,我們說 Ruby 沒有函數(shù),只有方法.而且實(shí)際上有不止一種方法.這一節(jié)我們介紹 訪問控制 (accesscontrols). 想想當(dāng)我們?cè)谧罡邔佣皇窃谝粋€(gè)類的定義里定義...

    ruby教程網(wǎng)3572020-04-08
  • Ruby簡(jiǎn)要說明Ruby中的迭代器

    簡(jiǎn)要說明Ruby中的迭代器

    這篇文章主要介紹了Ruby中的迭代器,迭代器的概念在動(dòng)態(tài)語言的編程中十分重要,文章中介紹了Ruby中的each迭代器和collect迭代器,需要的朋友可以參考下 ...

    goldensun2772020-04-25
主站蜘蛛池模板: 国产噜噜噜噜噜久久久久久久久 | 国产午夜精品久久久久婷 | 少妇一级淫片免费放4p | 精品国产91久久久久久浪潮蜜月 | 中国漂亮护士一级a毛片 | 黄色特级大片 | 亚洲成人福利 | 国产精品免费成人 | 久久久久久久久久久av | 毛片在线免费播放 | 99热1 | av手机在线免费播放 | 成人三级电影在线 | 性高跟鞋xxxxhd4kvideos | 黄片一级毛片 | 亚洲成人自拍电影 | 免费看国产 | 99国产精品国产免费观看 | 久久久久一本一区二区青青蜜月 | 亚洲一级簧片 | 国产成人在线观看免费网站 | 国产一级一区 | 欧美18—19sex性护士中国 | 成人在线视频一区 | 国产福利视频在线观看 | 国产孕妇孕交大片孕 | 男女羞羞视频在线观看免费 | 久久久久国产一区二区三区不卡 | 久久老司机精品视频 | 国产jjizz一区二区三区视频 | 美女污污视频在线观看 | 欧美a一| 精品一区二区三区网站 | 欧美日韩亚洲一区二区三区 | 亚洲精品成人久久久 | 91短视频在线视频 | 一本一道久久久a久久久精品91 | 日韩在线黄 | 在线成人看片 | 欧美18一12sex性处hd | 欧美xxxwww|