[株専][Java][Uruma][JRuby]JRubyを BSFで扱ってみる(その2)
JRubyのディレクトリ構造
主要そうなディレクトリのみ記載。
jruby + bin + lib + bsf.jar + jruby.jar + ruby + 1.8 ← Rubyのデフォルトライブラリ + gems ← gemで追加したライブラリ + site_ruby ← 各ディストリビューション向け JRubyやJava関連もこの中 + share ← ライブラリ
gem
Rubyには gem というライブラリ管理コマンドがあります。
例えるなら、PerlのCPANやLinux Rpmのapt、yumみたいなもの。
使い方の参考サイト。
- http://webos-goodies.jp/archives/51106257.html
- http://jp.rubyist.net/magazine/?0006-PackageManagement
HTML解析ライブラリのmechanizeをインストールしてみます。
mechanizeについては以下を参考。
インストール
$ gem install mechanize JRuby limited openssl loaded. gem install jruby-openssl for full support. http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL Updating metadata for 265 gems from http://gems.rubyforge.org ......................................................................................................................................................................................................................................................................... complete Successfully installed hpricot-0.6-java Successfully installed rubyforge-0.4.5 Successfully installed hoe-1.5.1 Successfully installed mechanize-0.7.5 4 gems installed Installing ri documentation for hpricot-0.6-java... Installing ri documentation for rubyforge-0.4.5... Installing ri documentation for hoe-1.5.1... Installing ri documentation for mechanize-0.7.5... Installing RDoc documentation for hpricot-0.6-java... Installing RDoc documentation for rubyforge-0.4.5... Installing RDoc documentation for hoe-1.5.1... Installing RDoc documentation for mechanize-0.7.5...
テストソースコード
gemのライブラリを利用するため、一行目に require 'rubygems' を記載します。
$ cat ~/ruby/test.rb require 'rubygems' require 'hpricot' require 'open-uri' doc = Hpricot( open("http://www.kmc.gr.jp/").read ) (doc/:a).each do |link| puts "#{link.inner_html} → #{link[:href]}" end
実行してみます。Errorになりますね。。。
結果
$ jruby ./test.rb Exception in thread "main" java.lang.NoSuchMethodError: org.jruby.runtime.builtin.IRubyObject.getInstanceVariable(Ljava/lang/String;)Lorg/jruby/runtime/builtin/IRubyObject; at HpricotScanService.hpricot_scan(HpricotScanService.java:931) at HpricotScanService.__hpricot_scan(HpricotScanService.java:1324) at HpricotScanServiceCallback$__hpricot_scan_S1.call(Unknown Source) at org.jruby.runtime.callback.InvocationCallback.execute(InvocationCallback.java:67) at org.jruby.internal.runtime.methods.FullFunctionCallbackMethod.call(FullFunctionCallbackMethod.java:69) at org.jruby.runtime.CallSite$InlineCachingCallSite.cacheAndCall(CallSite.java:87)
小一時間格闘の末、パッチがあることが判明。
JRubyベンチマーク
http://blog.gijutsuya.jp/harajune/2008/04/04/jruby%e3%83%99%e3%83%b3%e3%83%81%e3%83%9e%e3%83%bc%e3%82%af/
hpricotはgemで落としてきたのではエラーが出て動きません。パッチがあるらしくそれを当ててあるのが、ここのサイトから落とせます。mechanaizeでもhpricotを使っているのでこれは必須。http://www.telscenter.org/confluence/download/attachments/20236/hpricot-0.6.159-java.gem
インストール
$ gem install --local hpricot Successfully installed hpricot-0.6.159-java 1 gem installed Installing ri documentation for hpricot-0.6.159-java... Installing RDoc documentation for hpricot-0.6.159-java...
再度実行
$ jruby ./test.rb → http://www.kmc.gr.jp/ Top → http://www.kmc.gr.jp Guidance → guidance.html Project → project.html Event → event.html Members → members.html Link 竊 link.html SitePolicy 竊 misc.html 部員専用ページへ 竊 https://www.kmc.gr.jp/ 竊 http://www.kmc.gr.jp/ 竊 guidance.html 竊 project.html 竊 event.html
おぉー うまく動きました。
でも、文字化けしてますね。。。。
あと、JRubyの立ち上げが遅い です。 3秒はかかってますね。