2019年1月8日火曜日

JRuby 超入門

概要

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 件のコメント:

コメントを投稿