LoginSignup
6
5

More than 3 years have passed since last update.

gradleのみでjrubyをwindows向けにexe化し、jre内蔵してzipする

Last updated at Posted at 2021-03-21

はじめに

Jruby覚えてますか?JRubyはまだ現役です。こういう言語を扱うと必ずと言っていいほど、「javaでいいじゃん」と言われます。確かにJRubyでできることはJVMでできることです。
現状ではRubyが好きな人がたまに使うといった感覚でしょうか。

ですが、私はJrubyでJava開発のテストを書いてます。理由は生産性が高いからです。

この記事では普段Java使いのみなさんがJrubyで楽できるtipsを紹介します。

*ご意見いただいたのでjreを内蔵してexe化できるtipsも追記しました。
合わせて、タイトルを「実はJrubyはgradleだけで管理できる」から「gradleのみでjrubyをwindows向けにexe化し、jre内蔵してzipする」に変更しました。

依存環境

ですが、全て意識しなくていいです。管理はすべてgradleで行います。ここでは一旦、jrubyのコマンドも忘れてしまいましょう。

初期プロジェクトを立ち上げる

必要なのは2つのファイルだけです。

terminal
mkdir sample
cd sample
nvim build.gradle #neovimはいいぞ
nvim main.rb
build.gradle
/*
 * 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
}

main.rb
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ライブラリを呼び出す場合は、

build.gradle
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ゴリゴリ書いてごまかしました。

build.gradle
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'
}

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/*

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5