エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

Gradelまとめ

きっかけ

なんとなく知っているけど、なんとなくで終わっていることに違和感を感じたから。

参考に、下記の本をベースに学習した。

Gradle特徴

Gradleとは、Groovyを使ったビルドツール。

  • 柔軟な言語による記述
    Groovyで処理を記述するため、処理を分割したり構造化したりすることが簡単。
  • タスクによる処理の構築
    タスク単位でビルドスクリプトを作る。
  • 基本はJava/Groovy/Scala
    JavaJVM言語以外にもC/C++のビルドにも使える。
  • 各種のツールとの併用
    Antを利用したり、Mavenのpom.xmlをGradel用に変換したりするツールがある。
  • Mavenのセントラルリポジトリに対応 セントラルリポジトリを利用できる。

試した環境

OS情報

Microsoft Windows [Version 10.0.15063]

Groovy情報

Groovy Version: 2.4.12 JVM: 9 Vendor: Oracle Corporation OS: Windows 10

Gradle情報

------------------------------------------------------------
Gradle 4.3
------------------------------------------------------------

Build time:   2017-10-30 15:43:29 UTC
Revision:     c684c202534c4138b51033b52d871939b8d38d72

Groovy:       2.4.12
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:          9 (Oracle Corporation 9+181)
OS:           Windows 10 10.0 amd64

Java情報

java version "9.0.1"
Java(TM) SE Runtime Environment (build 9.0.1+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.1+11, mixed mode)

2017/11/05時点では、Groovy/Gradleのコマンド打つとWarninng出るけど、気にせず実行。

試し実装

プロジェクト初期化

gradle init --type java-library

プロジェクト構成

.gradleフォルダ タスクで生成されたファイルが配置される
gradleフォルダ Gradle環境をまとめたラッパークラスが格納されている。
srcフォルダ ソースコード関連の配置フォルダ
build.gradle Gradleのビルドファイル
gradlew/gradlew.bat Gradleコマンド
settings.gradle 設定情報を記述したファイル

srcフォルダの構成は、Mavenと同じ。 なお、、gradle initの際に、--type java-libraryのオプションを付けると、指定した言語のサンプルコードが生成される。

build.gradleは、ビルド内容を記述したファイル。
settings.gradleは、ビルドの設定情報が記述されている。

build.gradleの基本

ビルドが基本だが、プログラムチックな動きもできる。

例えば、下記の記述をbuild.gradleに追加してgradle heloと実行した場合、pringlnで指定した内容が出力される。

task helo {
    doLast {
        println();
        println("====================================");
        println("Welcome to Gradle!");
        println("====================================");
        println();
    }
}

タスクは、doFirst/doLastで構成されている。
実行順序は、doFirst -> doLast

パラメータの利用

まずは、実験用のコードとして、下記をbuild.gradleに追加する。

task helo {
    doLast {
        def total = 0;
        for (def i in 1..num.toInteger()) {
            total += i;
        }
        
        println("total: " + total);
    }
}

やっているのは、1からnumまでの合計を出力している。
引数は、Javaと同じくStringで渡される。
ここでの引数は、numが引き渡される想定。

実行には、下記のようなコマンドを実行する。

gradle helo -q -Pnum=100

引数の渡し方は、-Pプロパティ名=値という形式になる。

動的タスクの生成

形式

task "$変数名" { /** 処理 **/ }

def arr = ["one", "two", "three", "four", "five"];
arr.each { s ->
    task "$s" {
        doLast{
            println("this is $s task.")
        }
    }
}

gradle -q oneで実行すると、this is one task.が表示される。
動的にタスクを作れるので、共通化をしやすくなる。

javaのビルドには、Javaプラグインを使う。
apply plugin: 'java'をguild.gradleを追加し、gradle javaと実行すれば、buildフォルダが作成され、その中のclassフォルダの中にコンパイルしたソース群が出力される。

テストを実行したい場合は、gradle testで実行可能。 結果のレポートは、build\reports\tests\test\index.htmlに出力される。