はじめに
Jruby覚えてますか?JRubyはまだ現役です。こういう言語を扱うと必ずと言っていいほど、「javaでいいじゃん」と言われます。確かにJRubyでできることはJVMでできることです。
現状ではRubyが好きな人がたまに使うといった感覚でしょうか。
ですが、私はJrubyでJava開発のテストを書いてます。理由は生産性が高いからです。
この記事では普段Java使いのみなさんがJrubyで楽できるtipsを紹介します。
*ご意見いただいたのでjreを内蔵してexe化できるtipsも追記しました。
合わせて、タイトルを「実はJrubyはgradleだけで管理できる」から「gradleのみでjrubyをwindows向けにexe化し、jre内蔵してzipする」に変更しました。
##依存環境
- gradle
- Jruby
- jruby-gradle-plugin
-
http://jruby-gradle.org/
これだけです。
-
http://jruby-gradle.org/
ですが、全て意識しなくていいです。管理はすべてgradleで行います。ここでは一旦、jrubyのコマンドも忘れてしまいましょう。
初期プロジェクトを立ち上げる
必要なのは2つのファイルだけです。
mkdir sample
cd sample
nvim build.gradle #neovimはいいぞ
nvim main.rb
/*
* This is sample programs under the jruby.
*@ak.f
*/
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.github.jruby-gradle:jruby-gradle-plugin:2.0.0'
classpath 'com.github.jruby-gradle:jruby-gradle-jar-plugin:2.0.0'
classpath 'com.github.jengelman.gradle.plugins:shadow:5.0.0'
}
}
apply plugin: 'com.github.jruby-gradle.jar'
repositories {
jcenter()
ruby.gems()
}
dependencies {
jrubyJar 'org.slf4j:slf4j-simple:1.7.12'
jrubyJar "rubygems:colorize:0.7.7+"
}
jrubyJar {
initScript "./main.rb"
}
task jrubyRun(type: Exec){
dependsOn jrubyJar
workingDir "./build/libs"
commandLine 'java', '-jar', jrubyJar.outputs.files.singleFile.absolutePath
}
require 'colorize'
java_import 'org.slf4j.Logger'
java_import 'org.slf4j.LoggerFactory'
logger = LoggerFactory.getLogger('demo')
puts "-" * 20
logger.info "Ruby version: #{RUBY_VERSION}"
logger.info "Ruby platform: #{RUBY_PLATFORM}"
logger.info "Current file: #{__FILE__}"
puts "-" * 20
puts "Roses are red".red
puts "Violets are blue".blue
puts "I can use JRuby/Gradle".green
puts "And now you can too!".yellow
以上がサンプルプロジェクトになります。
自分の管理するJavaライブラリを呼び出す場合は、
repositories {
jcenter()
ruby.gems()
maven {url 'mavenリポジトリのURL'}}
dependencies {
jrubyJar 'xxx.org:name:version'
}
として参照してやればgradleが全部やってくれます。
コマンドチートシート
- とりあえず実行する
gradle jrubyRun
- jarファイルにビルドする
gradle jrubyJar
- ビルドファイルを削除する
gradle clean
- ビルドしたものを実行する
java -jar build/libs/sample-jruby.jar
##最後に
今どきのJRubyでした。
最近は日本語に記事であまり話題に上がらないですが、実務ではjavaライブラリのテストケースや、使い捨てのメインクラスを作成するぐらいなら私はJrubyで書くようになりました。
gradleで管理できるのが最高です。
ほとんど、http://jruby-gradle.org/ で紹介されているとおりですが、
build.gradleにはjrubyRunのタスクを定義してあります。
windows向けに配布する
launch4jとbashゴリゴリ書いてごまかしました。
buildscript {
repositories {
jcenter()
maven { url "https://plugins.gradle.org/m2/" }
}
dependencies {
classpath 'com.github.jruby-gradle:jruby-gradle-plugin:2.0.0'
classpath 'com.github.jruby-gradle:jruby-gradle-jar-plugin:2.0.0'
classpath 'com.github.jengelman.gradle.plugins:shadow:5.0.0'
classpath "edu.sc.seis.launch4j:launch4j:2.4.9"
}
}
apply plugin: "edu.sc.seis.launch4j"
apply plugin: 'com.github.jruby-gradle.jar'
repositories {
jcenter()
ruby.gems()
}
dependencies {
jrubyJar 'org.slf4j:slf4j-simple:1.7.12'
jrubyJar "rubygems:colorize:0.7.7+"
}
jrubyJar {
initScript "./src/main.rb"
}
task jrubyRun(type: Exec){
dependsOn jrubyJar
workingDir "./build/libs"
commandLine 'java', '-jar', jrubyJar.outputs.files.singleFile.absolutePath
}
launch4j {
copyConfigurable = project.tasks.jrubyJar.outputs.files
jar = jrubyJar.outputs.files.singleFile.absolutePath
headerType = 'console'
bundledJrePath = 'jdk-11.0.10+9-jre'
bundledJre64Bit= true
}
task pack(type: Exec , dependsOn: createExe) {
commandLine '/bin/bash' , 'pack.sh'
}
rm win-release.zip
jredir=$(cd $(dirname $0); pwd)"/jdk-11.0.10+9-jre"
if [ -d $jredir ]; then
echo "exiting $jredir"
else
wget "https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.10%2B9/OpenJDK11U-jre_x64_windows_hotspot_11.0.10_9.zip"
unzip "OpenJDK11U-jre_x64_windows_hotspot_11.0.10_9.zip"
rm "OpenJDK11U-jre_x64_windows_hotspot_11.0.10_9.zip"
echo "downloaded $jredir"
fi
mv $jredir build/launch4j/
zip -r win-release.zip ./build/launch4j/*