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

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

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

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

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

##依存環境
* gradle
    * https://gradle.org/releases/
* Jruby
    * https://www.jruby.org/
* jruby-gradle-plugin
    * http://jruby-gradle.org/
これだけです。

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

## 初期プロジェクトを立ち上げる
必要なのは2つのファイルだけです。


```bash:terminal
mkdir sample
cd sample
nvim build.gradle #neovimはいいぞ
nvim main.rb
```

```groovy: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
}

```

```ruby: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ライブラリを呼び出す場合は、

```groovy: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ゴリゴリ書いてごまかしました。

```groovy: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'
}

```

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

```