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でビルドしてみることにする。
依存ライブラリがあった場合の挙動を検証したいので、適当なcommons-langライブラリを使うプロジェクトとする。ただしmavenなどは使わず、シンプルにプロジェクト内のlibディレクトリに必要なjarを格納し、クラスパスに追加する構成とする。
実行可能プログラムとして、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}" } }
gradleビルドスクリプト作成
続いて、これをgradleでビルドしてみる。
プロジェクト上で[New] -> [File]から build.gradleというファイルを新規作成し、この時点ではとりあえず以下の内容のみを記載。
build.gradle
apply plugin: 'groovy'
build.gradleを実行してみると、以下のエラーが出て実行されない。groovyプロジェクトがgradleを認識していないよう。
Error running build: Module 'SampleApp' is not backed by gradle
そこで、次の設定をする。
[SampleApp]プロジェクトを選択した状態で、メニューバーの[File] > [Open]から、build.gradeを開く。
[Import Project from Gradle]が開くので、Gradle homeに最初にダウンロードして展開したgradleのパスを指定し、OK。
[Open Project]ウィンドウにて、[Delete Existing Project and Import]を選択
[New Project]ウィンドウにて、[This Window]を選択
build.gradeを実行すると、今度は正常に実行でき、BUILD SUCCESSFULとなることを確認
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でビルドできることを確認
ビルド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を使うと細かい制御がいろいろできるので、ビルドも自動でできるようにしておくと便利!
以上