カタカタブログ

SIerで働くITエンジニアがカタカタした記録を残す技術ブログ。Java, Oracle Database, Linuxが中心です。たまにRuby on Railsなども。

IntelliJ IDEAでgroovyプロジェクトをgradleでビルドする

IntelliJ IDEAで開発したgroovyプロジェクトをgradleを使ってjarにビルドする方法をまとめてみる。
groovyだと簡単なライブラリや実行可能なスクリプトとして作ることが多い。そのため、IDE上でしか実行できないのはいろいろと不便なので、IntelliJ上でビビルドして実行可能jarファイルを自動で作れるようにした。せっかくなので、gradleを使ってみる。

今回の環境は以下。

  • Mac OS X Yosemite 10.10.5
  • IntelliJ IDEA 14.1.2 (Community Edition)
  • gradle 2.6
  • groovy 2.4.3

gradleインストール

まず、gradleをインストールする。
以下から現時点で最新のgradle 2.6 (gradle-2.6-all.zip)をダウンロードし、取得したzipファイルを適当なパスに展開する。
https://gradle.org/

groovyサンプルプロジェクト作成

今回はSampleAppという名前のサンプル用groovyプロジェクトを作成して、これをgradleでビルドしてみることにする。
f:id:osn_th:20150922202501p:plain
依存ライブラリがあった場合の挙動を検証したいので、適当なcommons-langライブラリを使うプロジェクトとする。ただしmavenなどは使わず、シンプルにプロジェクト内のlibディレクトリに必要なjarを格納し、クラスパスに追加する構成とする。
f:id:osn_th:20150922202512p:plain
実行可能プログラムとして、Mainクラスのmainメソッドに与えた引数をuncapitalizeして標準出力するだけというシンプルなものとした。ただしuncapitalizeメソッドは依存ライブラリのStringUtilsクラスのメソッドを使用している。

・Main.groovy

import org.apache.commons.lang3.StringUtils

class Main {
    static void main(String[] args) {
        def uncapitalized = args.collect { StringUtils.uncapitalize(it) }
        println "original=${args}"
        println "uncapitalized=${uncapitalized}"
    }
}

f:id:osn_th:20150922202509p:plain

gradleビルドスクリプト作成

続いて、これをgradleでビルドしてみる。
プロジェクト上で[New] -> [File]から build.gradleというファイルを新規作成し、この時点ではとりあえず以下の内容のみを記載。

build.gradle

apply plugin: 'groovy'

build.gradleを実行してみると、以下のエラーが出て実行されない。groovyプロジェクトがgradleを認識していないよう。
f:id:osn_th:20150922202452p:plain

Error running build:
Module 'SampleApp' is not backed by gradle

そこで、次の設定をする。
[SampleApp]プロジェクトを選択した状態で、メニューバーの[File] > [Open]から、build.gradeを開く。
[Import Project from Gradle]が開くので、Gradle homeに最初にダウンロードして展開したgradleのパスを指定し、OK。
f:id:osn_th:20150922202456p:plain
[Open Project]ウィンドウにて、[Delete Existing Project and Import]を選択
f:id:osn_th:20150922202459p:plain
[New Project]ウィンドウにて、[This Window]を選択
f:id:osn_th:20150922202450p:plain
build.gradeを実行すると、今度は正常に実行でき、BUILD SUCCESSFULとなることを確認
f:id:osn_th:20150922202446p:plain

gradleとの疎通ができたので、以下、ビルドスクリプトを構成していく。
以下のgroovyプラグインのページを参考に。
http://gradle.monochromeroad.com/docs/userguide/groovy_plugin.html

build.gradleを以下の構成にする。

apply plugin: 'groovy'

defaultTasks 'build'

repositories {
    mavenCentral()
}

// groovy-allとlibディレクトリのjarを依存ライブラリとして設定
dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.4.3'
    compile fileTree(dir: "lib", include: '*.jar')
}

// srcディレクトリを対象とする
sourceSets.main.groovy.srcDirs = ['src']

// MainクラスをMain-Classとし、libディレクトリのjarをクラスパスに追加するようなマニフェストファイルをjarに追加する
jar {
    manifest {
        attributes 'Main-Class': 'Main'
        attributes 'Class-Path': configurations.compile.collect { "lib/${it.getName()}" }.join(' ')
    }
}

今回、検証にあたってgradleビルドスクリプトに盛り込んだポイントは以下。

  • ソースコードのディレクトリ構成が標準的なMaven構成(src/main)とは異なる => sourceSets.main.groovy.srcDirsでソースディレクトリを明示的に指定
  • プロジェクト内に依存jarを持つ => dependenciesにlibディレクトリのjarファイルを含むように指定(また、groovy-allは必ず指定する必要があるよう)
  • 実行可能jarとして出力する => マニフェストファイルにMain-ClassとClass-Pathを明示して出力するように指定

このbuild.gradleでビルドできることを確認
f:id:osn_th:20150922202505p:plain

ビルドjarの動作確認

gardleビルドして作ったjarで実行できることを確認する。
マニフェストより、libにjarを配置する構成としているため、いったんそのように依存ライブラリを配置する。

$ pwd
/Users/xxx/IdeaProjects/SampleApp/build/libs
$ find .
.
./lib
./lib/commons-lang3-3.4.jar
./lib/groovy-all-2.4.3.jar
./SampleApp.jar

java -jarコマンドで実行する。

$ java -jar SampleApp.jar abc Abc ABC
original=[abc, Abc, ABC]
uncapitalized=[abc, abc, aBC]

期待どおりの結果であることを確認。ビルドは正しく行われているよう。

まとめ

IntelliJ IDEAでgroovyプロジェクトを作り、それをgradleでビルドして実行可能jarを作るまでの一覧の流れを検証できた。
gradleを使うと細かい制御がいろいろできるので、ビルドも自動でできるようにしておくと便利!

以上