校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 利用RJB在Ruby on Rails中使用Java代碼的教程

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

熱門標簽:高德地圖標注客服 電銷機器人廠商代理 徐州網絡外呼系統哪個好 百度地圖標注自定義圖片 滴滴外呼系統 常德電銷平臺外呼系統軟件價格 湖州u友防封電銷卡 地圖標注賺錢項目注冊 白銀外呼paas系統

開始之前
關于本教程

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。如果還沒有,請在 參考資料 小節中找到相關文檔的鏈接,以幫助您在自己的系統上安裝和配置 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。

通過 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 環境變量中:

[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 類,需要執行兩個步驟:

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

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

require 'rjb'

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

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

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

現在,可以將準備使用的 Java 類導入到 Ruby 中,實例化這些類,并調用所需的方法。
將 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,這意味著類被正確裝載,并成功創建了該類的對象。
調用方法并捕獲結果

將類裝載到 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 是最好的選擇。

整體而言,在 Rails 應用程序中重用遺留 Java 代碼的能力非常有用。使用 Java 語言實現的設計和編寫都非常良好的業務邏輯不會擱置不用,相反,可以在新的 Web 應用程序中繼續發揮有用的功能。

您可能感興趣的文章:
  • 使用Ruby來處理文本的教程
  • 使用Ruby編寫腳本進行系統管理的教程
  • Ruby中關于hash的基本使用方法

標簽:三沙 荊門 梧州 張家界 普洱 遼寧 公主嶺 永州

巨人網絡通訊聲明:本文標題《利用RJB在Ruby on Rails中使用Java代碼的教程》,本文關鍵詞  利用,RJB,在,Ruby,Rails,中,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《利用RJB在Ruby on Rails中使用Java代碼的教程》相關的同類信息!
  • 本頁收集關于利用RJB在Ruby on Rails中使用Java代碼的教程的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    日韩一区二区三区四区| 午夜久久久影院| 亚洲无人区一区| 日韩国产欧美在线观看| 国产一区二区视频在线| 成人黄色a**站在线观看| 欧美在线不卡视频| 日韩欧美123| 国产精品国产三级国产普通话三级 | 久久99国产精品久久99| 国产成人亚洲综合a∨婷婷| 色94色欧美sute亚洲线路一ni| 欧美中文一区二区三区| 精品sm捆绑视频| 亚洲精品乱码久久久久| 国产精品资源网站| 欧美日韩不卡在线| 亚洲视频狠狠干| 国产美女精品人人做人人爽 | 色婷婷狠狠综合| 久久日韩精品一区二区五区| 亚洲一卡二卡三卡四卡五卡| 国产成人在线视频网址| 在线综合+亚洲+欧美中文字幕| 日本一区二区视频在线观看| 久久se这里有精品| 91精品国产综合久久香蕉的特点| 亚洲男同性恋视频| 99这里只有久久精品视频| 欧美大片国产精品| 日一区二区三区| 欧美主播一区二区三区美女| 亚洲少妇中出一区| 成人激情午夜影院| 国产精品―色哟哟| 国产成人在线看| 久久综合九色综合97_久久久| 日韩高清在线电影| 欧美精品v日韩精品v韩国精品v| 亚洲一线二线三线视频| 在线看不卡av| 亚洲国产视频a| 在线观看91av| 精品写真视频在线观看| 久久色视频免费观看| 国产成人av资源| 亚洲日本电影在线| 欧美无砖专区一中文字| 丝袜亚洲另类欧美综合| 日韩精品一区二区三区中文精品| 美女视频一区二区| 日本一区二区三级电影在线观看 | 国产精品一区三区| 国产精品国产自产拍高清av王其| www.欧美日韩| 亚洲国产毛片aaaaa无费看 | 午夜久久久久久久久| 日韩精品专区在线影院观看| 丁香桃色午夜亚洲一区二区三区| 亚洲国产精品成人综合| 在线观看一区日韩| 蜜臀av亚洲一区中文字幕| 久久精品无码一区二区三区| av影院午夜一区| 日本亚洲一区二区| 国产精品卡一卡二卡三| 欧美日韩在线播放| 国产成人8x视频一区二区 | 久久精品国产在热久久| 国产精品美女久久久久久久久久久| 在线免费视频一区二区| 国产成人精品免费网站| 天天av天天翘天天综合网| 国产嫩草影院久久久久| 欧美久久免费观看| 色综合天天综合色综合av | 国产成人亚洲综合a∨婷婷| 亚洲电影视频在线| 自拍偷拍欧美激情| 亚洲视频一区二区在线| 9191久久久久久久久久久| 亚洲自拍偷拍网站| 884aa四虎影成人精品一区| 免费在线观看成人| 亚洲欧洲精品一区二区三区| 蜜臀av一级做a爰片久久| 久久久久久久久久看片| 欧美久久久久久久久久| 91丨porny丨蝌蚪视频| 国产98色在线|日韩| 美国一区二区三区在线播放| 亚洲第四色夜色| 亚洲国产精品精华液网站| 一区二区三区在线观看网站| 国产精品美女久久久久aⅴ国产馆| 欧美va亚洲va香蕉在线| 欧美一二三区在线| 国产福利一区在线| 亚洲一区二区在线观看视频 | 91精品欧美一区二区三区综合在| 99re成人精品视频| 成人国产一区二区三区精品| 国产精品一二三四区| 国内成人免费视频| 国产精品77777| 成人精品国产一区二区4080| a级精品国产片在线观看| a亚洲天堂av| 欧美高清视频在线高清观看mv色露露十八| 日本韩国一区二区三区视频| 精品视频在线视频| 日韩免费成人网| 中文字幕av一区二区三区高| 亚洲男人的天堂av| 麻豆91精品视频| gogogo免费视频观看亚洲一| 欧美视频在线不卡| 欧美精品一区二区高清在线观看| 国产精品乱人伦| 亚洲高清久久久| 国产aⅴ精品一区二区三区色成熟| 丁香啪啪综合成人亚洲小说 | 欧美三级午夜理伦三级中视频| 欧美日韩国产一二三| 国产欧美va欧美不卡在线| 亚洲一区在线观看免费| 国产成人自拍网| 91精品国产高清一区二区三区蜜臀| 久久亚洲影视婷婷| 亚洲成人自拍偷拍| 成人在线综合网| 欧美一级黄色录像| 亚洲国产精品久久一线不卡| 丁香婷婷深情五月亚洲| 日韩欧美中文一区| 亚洲一二三四区不卡| 丁香亚洲综合激情啪啪综合| 欧美大肚乱孕交hd孕妇| 亚洲成人一区二区| 色噜噜夜夜夜综合网| 国产精品午夜免费| 国产成人午夜电影网| 久久只精品国产| 日本美女一区二区| 91精品国产综合久久精品图片| 一区二区免费看| 一本大道久久a久久综合| 中文子幕无线码一区tr| 成人精品小蝌蚪| 国产精品欧美久久久久一区二区| 国产美女视频91| 久久精品视频一区| 高清av一区二区| 欧美国产禁国产网站cc| 国产成人精品免费视频网站| 亚洲国产精品99久久久久久久久| 成人免费福利片| 亚洲欧美激情视频在线观看一区二区三区| jlzzjlzz欧美大全| 亚洲乱码一区二区三区在线观看| 一本大道久久a久久综合| 一区二区久久久| 日韩欧美国产综合在线一区二区三区 | 成人夜色视频网站在线观看| 国产精品久久久久久亚洲毛片 | 99久久国产综合精品女不卡| 亚洲天堂精品在线观看| 欧美日韩一本到| 黑人精品欧美一区二区蜜桃| 久久久国产一区二区三区四区小说 | 91精品国产品国语在线不卡| 精品一区二区三区在线视频| 国产精品电影院| 欧美乱妇一区二区三区不卡视频| 精品一区免费av| 中文字幕一区二区三| 欧美日韩高清在线| 国产福利一区在线| 亚洲国产综合91精品麻豆| 26uuu国产日韩综合| 91精品1区2区| 国产一区二区在线免费观看| 亚洲免费在线观看视频| 日韩一区二区在线看片| 色婷婷av一区二区三区软件| 久久精品国产**网站演员| 一区二区三区蜜桃| 国产欧美精品一区二区色综合 | 国产精品麻豆视频| 日韩欧美国产综合在线一区二区三区| 91浏览器入口在线观看| 九九久久精品视频| 日韩影院在线观看| 亚洲一区在线观看视频| 亚洲欧美影音先锋| 国产午夜精品美女毛片视频| 欧美成人性战久久| 欧美成人乱码一区二区三区| 欧美日韩在线三区| 欧美日韩高清影院|