概要
jruby に入門してみました
インストールから基本的な使い方のサンプルを紹介します
環境
- Ubuntu 16.04
- rvm 1.29.7
- jruby 9.2.5.0
- OpenJDK build 9-internal+0-2016-04-14-195246.buildd.src
jruby インストール
rvm install jruby
Hello World
- vim test1.rb
puts "hello world"
# sleep 100
- jruby test1.rb
これで「hello world」が表示されると思います
ちゃんと jvm 上で動作しているかどうかは sleep の部分をコメントアウトして ps aux | grep java
あたりでプロセスを見れば java のプロセスが起動していることが確認できると思います
標準ライブラリを使う
Ruby の標準ライブラリを require して使ってみます
- vim test2.rb
require 'json'
h = JSON.parse('{"key":"value"}')
p h
- jruby test2.rb
これでハッシュの情報が表示されます
Enumerable を使う
- vim test3.rb
a = [1, 2, 3, 4, 5]
ret = a.each.inject { |sum, i| sum + i }
puts ret
- jruby test3.rb
この辺りは普通に使えますね
Java のクラスを使う
JVM 上で動いているので Java の標準クラスも使えます
例えば ArrayList を使ってみます
- vim test4.rb
a = java.util.ArrayList.new
a.add 1
a.add 2
# puts a.class
puts a
- jruby test4.rb
で実行すると [1, 2]
という感じで表示されます
クラスを見ると Java::JavaUtil::ArrayList
というクラスになっていました
gem で公開されているライブラリを使う
rubygems で公開されている gem をインストールして使ってみます
-S
オプションでサブコマンドを実行できます
bundler を使っていないのでグローバルインストールになるので注意してください
jruby -S gem install logger-colors
- vim test5.rb
require 'logger/colors'
logger = Logger.new(STDOUT)
logger.info "hoge"
- jruby test5.rb
こんな感じで普通に使えました
ただ、C のコンパイルを必要とするネイティブライブラリなどは一部動作しない場合もあるようです
bundler を使う
上記の bundler を使った版です
おそらくこちらのほうがグローバル環境を汚さないのでおすすめです
なお test5.rb の内容は同じです
- bundle init
- vim Gemfile
# frozen_string_literal: true
source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
gem "logger-colors"
bundle install --path vendor
jruby -S bundle exec jruby test5.rb
既存の Java を使う
これが一番よくあるケースかもしれません
既存の jar や java のコードを Ruby から使う方法です
以下のサンプルでは Java のコードがないのでそちらを作成するところから始めています
- vim Test.java
public class Test{
public static String smethod(){
return "smethod";
}
public String method() {
return "method";
}
public String method(String str) {
return str;
}
}
- javac Test.java
で一旦 Test.class を生成しておきます
- vim test6.rb
java_import 'Test'
puts Test.smethod
puts Test.new.method
puts Test.new.method "Test.java"
- jruby test6.rb
こんな感じで呼び出すことができます
java_import
文を使って使いたいクラスを指定するのがポイントです
引数なども普通に Ruby の構文として使えます
少し応用になりますが既存の jar や java ファイルを管理するツールとして jbundler などもあるようです
Maven などの jar も参照できるようです
jruby + sinatra
- vim Gemfile
gem "sinatra"
bundle install --path vendor
- vim test7.rb
require 'sinatra'
get '/' do
'ok'
end
jruby -S bundle exec jruby test7.rb
で localhost:4567 で普通に動作します
最後に
JRuby に入門してみました
実行環境を JVM に移しただけなので ruby の文法をほぼそのまま使うことができます
CRuby に比べて実行時にコンパイルが行われるので起動の立ち上がりが遅いのが少し気になりました
JRuby がどこまで CRuby に追従しているかわかりませんがおそらく最新の JIT 機能などは使えないと思います
あとは JVM の機能 (GC やマルチスレッド機能など) をいかにうまく使うかかなと思います
逆に言うとヒープ領域などの管理もしっかりしなければならなくなりますが
0 件のコメント:
コメントを投稿