SlideShare a Scribd company logo
2014.04.30
綿引琢磨(@bikisuke)
http://d.hatena.ne.jp/bikisuke/
takuma.watabiki@jggug.org
2時間で分かる!
次世代ビルドツールの本命Gradleの
全貌 ∼基礎編∼
2
自己紹介
 綿引 琢磨(わたびき たくま)
 Twitter: @bikisuke
 https://www.facebook.com/takuma.watabiki.3
 株式会社デライトテクノロジーズ代表取締役
 日本Grails/Groovyユーザーグループ運営委員
 最近興味を持っているもの
 Spring Boot / TERASOLUNA Global Framework
 もちろんG* (ry
Gradle本
(執筆中)
基礎編 目次
 Gradleの基礎
 Gradleのアーキテクチャ
 Gradleの三大要素
 Java プロジェクト with Gradle
 Java プロジェクトの生成
 Java プラグインによるビルド
 マルチプロジェクト with Gradle
 マルチプロジェクトへの適用
 ビルドスクリプトの定義
3
4
Gradleの基礎
Gradle のアーキテクチャ
 自動化のための基盤とプラグイン機構による
粗結合な構造
 自動化のためのインフラとドメインオブジェクト群
 基盤だけでは何も出来ないに等しい
 直感的なドメインオブジェクトAPI
 強力なプラグイン機構
 標準的な機能も全てがプラグイン
 シンプルなインタフェースで追加が容易
 既存のプラグインの拡張や統合も可能
5
Gradle のアーキテクチャ
6
Java
JVM
Groovy OSS ライブラリ
Gradle コアライブラリ
Gradle 標準プラグイン
サードパーティ/オレオレ プラグイン
ビルドスクリプト
Gradle
Gradleの三大要素
 プロジェクト
 処理対象を表すコアドメイン
 必ず1つ以上のプロジェクトが存在
 タスク
 作業単位を表すコアドメイン
 ユーザーが実行できる最小単位
 プラグイン
 特定処理のための機能コンポーネント
 タスク、プロパティ、規約などをパッケージング
7
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
testCompile 'junit:junit:4.11'
}
task myTest(type:Test) << {
println 'myTest task executed.'
}
DSLとドメインオブジェクトの関係
8
ビルドスクリプトに定義した内容が、
処理対象のProjectオブジェクトとなる
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
testCompile 'junit:junit:4.11'
}
task myTest(type:Test) << {
println 'myTest task executed.'
}
DSLとドメインオブジェクトの関係
9
JavaPluginが適用されることで、Javaのビルド
に必要な機能がProjectに追加される
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
testCompile 'junit:junit:4.11'
}
task myTest(type:Test) << {
println 'myTest task executed.'
}
DSLとドメインオブジェクトの関係
10
JavaPluginにより追加された
Testタスクを拡張
11
Javaプロジェクト
with Gradle
Javaプロジェクトの生成
 init タスク(Build Init プラグイン)
 指定された初期化タイプの雛形を生成
 basic : ビルドスクリプト、Gradleラッパーを生成
 pom : pom.xmlを基にビルドスクリプト、Gradleラッパーを生成
 java-library : basic + Java規約ディレクトリ生成
 groovy-library : basic + Groovy規約ディレクトリ生成
 scala-library : basic + Scala規約ディレクトリ生成
 ※ 現在試験的なステータスの機能です
12
gradle init --type <初期化タイプ>
Javaプラグインによるビルド
 Java プラグインとは
 Javaプロジェクトのコンパイル、テスト、アーカイブに
必要なタスク、プロパティ、規約などを提供
 ソースセット: src/main/java, src/main/resources,
src/test/java, src/test/resources
 タスク: clean, compileJava, test, jar など
 プロパティ: sourceSets, sourceCompatibility,
reportsDir, testReportDir, archivesBaseName など
13
ビルドのタスクグラフ
14
ビルドのタスクグラフ
15
gradle build
ビルドのタスクグラフ
16
src/main/java配下のjavaコード
をコンパイルし、$buildDir/classes/
mainに出力
ビルドのタスクグラフ
17
src/main/resoueces配下の
ファイルを$buildDir/resources/
mainにコピー
ビルドのタスクグラフ
18
src/test/java配下のjavaコード
をコンパイルし、$buildDir/classes/
testに出力
ビルドのタスクグラフ
19
src/test/resoueces配下のファ
イルを$buildDir/resources/testに
コピー
ビルドのタスクグラフ
20
$buildDir/libsに
JARファイルを生成
ビルドのタスクグラフ
21
JUnit(xUnit)/TestNGを実行
ビルドのタスクグラフ
22
BUILD SUCCESS!
Javaのビルドでよく使用するプロパティ
23
タスク プロパティ 用途
compileJava/
compileTestJava
options
エンコーディングやブートクラスパスなどのコンパ
イルオプションを追加する際に使用
jar archiveName JARファイル名を設定する際に使用
test
minHeapSize テストプロセスに-Xmsを設定する際に使用
test maxHeapSize テストプロセスに-Xmxを設定する際に使用test
jvmArgs ヒープ以外のJVMパラメータを設定する際に使用
- sourceCompatibility コンパイル時に使用するJavaのバージョン
- targetCompatibility クラス生成時のターゲットとするJavaのバージョン
apply plugin: 'java'
  :
def defaultEncoding = 'UTF-8'
[compileJava, compileTestJava]*.options*.encoding =
defaultEncoding
sourceCompatibility = 1.7
targetCompatibility = 1.7
jar {
archiveName = 'jjug-night-seminar'
}
test {
minHeapSize = '512m'
maxHeapSize = '512m'
jvmArgs '-XX:MaxPermSize=256m'
}
ビルドスクリプトでの設定例
24
25
マルチプロジェクト
with Gradle
マルチプロジェクトへの適用
 基点となるルートプロジェクトに、サブプロジ
ェクトがツリー構造を成す
 デフォルトではsettings.gradleが配置されたディレクト
リがルートプロジェクトとなる
 settings.gradleにサブプロジェクト構成を定義
 Gradleがサポートするレイアウトは以下の2つ
 階層レイアウト
 フラットレイアウト
26
マルチプロジェクトへの適用
 階層レイアウト
 階層的な構造のプロジェクトで構成される
 settings.gradle
27
include ‘jonathan’, ‘george’, ‘joseph’
<ROOT_PROJECT>
├ jonathan
├ george
├ joseph
   !
├ settings.gradle
   " build.gradle
マルチプロジェクトへの適用
 フラットレイアウト
 同一階層のプロジェクトで構成される
 settings.gradle
28
includeFlat ‘giorno’, ‘bucciarati’, ‘mista’
<WORKSPACE>
├ <ROOT_PROJECT>
   ! ├ settings.gradle
   ! " build.gradle
├ giorno
├ bucciarati
" mista
レイアウトの特徴
 レイアウトはルートプロジェクトとサブプロ
ジェクトの位置関係で決まる
 ルートプロジェクトがサブプロジェクトの上位階層
 階層レイアウト
 ルートプロジェクトとサブプロジェクトが同一階層
 フラットレイアウト
 レイアウトはプロジェクト単位のため、組み合わせる
ことも可能
29
ビルドスクリプトの定義
 ルートプロジェクトに集約
30
subprojects {
task showName << { println “$project.name” }
}
project(‘:jonathan’) {
dependencies { compile project(‘: george’) }
}
project(‘:george’) {
dependencies { compile project(‘: joseph’) }
}
project(‘:joseph’) {
}
ビルドスクリプトの定義
 ルートプロジェクトに共通設定&差分個別
31
subprojects {
task showName() << { println “$name” }
}
root/build.gradle
project(‘:jonathan’) {
dependencies { compile project(‘:george’) }
}
jonathan/build.gradle
project(‘:george’) {
dependencies { compile project(‘: joseph’) }
}
george/build.gradle
ビルドスクリプトの定義
 個別に定義
32
task showName() << { println “$name” }
joseph/build.gradle
dependencies { compile project(‘:george’) }
task showName() << { println “$name” }
jonathan/build.gradle
dependencies { compile project(‘: joseph’) }
task showName() << { println “$name” }
george/build.gradle
マルチプロジェクトの勘所
 レイアウトについて
 特定のシステムやサービスの中で使用することが明ら
かな場合は階層レイアウトが良い
 他システムでも使用するもの、汎用的なライブラリは
フラットレイアウトもしくは単一のプロジェクトとし
ておいた方が柔軟に対応できる
33
マルチプロジェクトの勘所
 ビルドスクリプトについて
 基本はルートプロジェクトに共通設定を定義して、差
分を個別のサブプロジェクトに定義するのが定石
 サブプロジェクトの数が少ない場合や、選任のビルド
職人がいる場合は、ルートプロジェクトに集約すると
効率が良いかも
 複数ベンダーで開発するような場合は、個別に定義し
た方が平和に治まることもある
34
以上、基礎編でした
35
休憩の後は ∼発展編∼ を
お楽しみください

More Related Content

Jjug 20140430 gradle_basic