[株専][Java][Uruma][JRuby]JRubyを BSFで扱ってみる(その2)

JRubyディレクトリ構造

主要そうなディレクトリのみ記載。

jruby
 + bin 
 + lib
   + bsf.jar
   + jruby.jar   
   + ruby   
          + 1.8 ← Rubyのデフォルトライブラリ
          + gems ← gemで追加したライブラリ
          + site_ruby ← 各ディストリビューション向け 
               JRubyJava関連もこの中
 + share ← ライブラリ

gem

Rubyには gem というライブラリ管理コマンドがあります。
例えるなら、PerlCPANLinux Rpmのapt、yumみたいなもの。

使い方の参考サイト。

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 
KMChttp://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/
京大マイコンクラブ公式WEB 竊’ http://www.kmc.gr.jp/
Guidance 竊’ guidance.html
Project 竊’ project.html
Event 竊’ event.html

おぉー うまく動きました。
でも、文字化けしてますね。。。。


あと、JRubyの立ち上げが遅い です。 3秒はかかってますね。