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

PDF
Gradleどうでしょう
PPTX
Jjug 20140430 gradle_advanced
PDF
Gradle handson
PDF
Spring in-summer-gradle-hands on-withanswers
PDF
OSS Product feat. Gradle
PDF
システム開発を前進させるためのGradle導入法
PDF
Gws 20141024 gradle_intro
PDF
Introduction to Spock
Gradleどうでしょう
Jjug 20140430 gradle_advanced
Gradle handson
Spring in-summer-gradle-hands on-withanswers
OSS Product feat. Gradle
システム開発を前進させるためのGradle導入法
Gws 20141024 gradle_intro
Introduction to Spock

What's hot (20)

PPTX
Gradle入門
PDF
Gradle布教活動
PDF
明日から使えるgradle
PPTX
Jenkins と groovy
PDF
Java開発の強力な相棒として今すぐ使えるGroovy
PPT
第5回勉強会
PDF
Gws 20130315 gradle_handson
PDF
Groovy base gradle_20130309
PDF
Cryogenでサイトつくろーじぇん
PDF
Groovyの紹介20130323
PDF
(IDEユーザのための) ClojureのEmacs開発環境について
PDF
Gws 20120521 gradle
PDF
What makes Geb groovy?
PDF
20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介
PPT
第4回勉強会 Groovyの文法からSpockまで
PDF
Use JWT access-token on Grails REST API
PPTX
JJUG CCC 2011 Fall / Web test automation with Geb and Spock
PDF
Grails 2.0.0.M1の話
PPTX
Webアプリのシナリオテスト自動化を運用に乗せるまでの10のステップ
PPTX
Jenkins勉強会 in 札幌 第二部
Gradle入門
Gradle布教活動
明日から使えるgradle
Jenkins と groovy
Java開発の強力な相棒として今すぐ使えるGroovy
第5回勉強会
Gws 20130315 gradle_handson
Groovy base gradle_20130309
Cryogenでサイトつくろーじぇん
Groovyの紹介20130323
(IDEユーザのための) ClojureのEmacs開発環境について
Gws 20120521 gradle
What makes Geb groovy?
20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介
第4回勉強会 Groovyの文法からSpockまで
Use JWT access-token on Grails REST API
JJUG CCC 2011 Fall / Web test automation with Geb and Spock
Grails 2.0.0.M1の話
Webアプリのシナリオテスト自動化を運用に乗せるまでの10のステップ
Jenkins勉強会 in 札幌 第二部
Ad

Similar to Jjug 20140430 gradle_basic (20)

PDF
Gradle a new Generation Build Tool
PDF
Agileツール適合化分科会(構成管理・ビルドツール)
PPTX
[社内勉強会]Gradleを使おう
PDF
Jjug 20140430 gradle_intro
PDF
Androidアプリ開発で活躍必至!? ビルドツールGradle
PPTX
Gradle再入門.pptx
PDF
20150425 DroidKaigi つかえるGradleプロジェクトの作り方
PDF
Grailsのススメ(仮)
PDF
Groovy Grails eXchage 2014 報告
PDF
Android App Development with Gradle & Android Studio
PDF
Javaな人が今すぐ使えるG*
PDF
G* Workshop in Fukuoka - Introduction
PDF
Read Groovy Compile process(Groovy Benkyoukai 2013)
PDF
Groovy kisobenkyoukai20130309
PDF
Jenkins plugin memo
PPT
Maven2 plugin
PDF
Android アプリ開発における Gradle ビルドシステム
PDF
gradle2.4のルールベースモデルコンフィギュレーション
PDF
GradleによるG*なビルドシステムの構築
PDF
TDD勉強会キックオフ for Java
Gradle a new Generation Build Tool
Agileツール適合化分科会(構成管理・ビルドツール)
[社内勉強会]Gradleを使おう
Jjug 20140430 gradle_intro
Androidアプリ開発で活躍必至!? ビルドツールGradle
Gradle再入門.pptx
20150425 DroidKaigi つかえるGradleプロジェクトの作り方
Grailsのススメ(仮)
Groovy Grails eXchage 2014 報告
Android App Development with Gradle & Android Studio
Javaな人が今すぐ使えるG*
G* Workshop in Fukuoka - Introduction
Read Groovy Compile process(Groovy Benkyoukai 2013)
Groovy kisobenkyoukai20130309
Jenkins plugin memo
Maven2 plugin
Android アプリ開発における Gradle ビルドシステム
gradle2.4のルールベースモデルコンフィギュレーション
GradleによるG*なビルドシステムの構築
TDD勉強会キックオフ for Java
Ad

More from Takuma Watabiki (13)

PDF
「普通の設計」をするということ
PDF
バックエンドのエンジニアがiOSアプリ開発をやってみて思うこと - フロントエンドのアーキテクチャの考察 -
PDF
『現場で役立つシステム設計の原則』は一般的なSI現場で役立つのか?
PDF
Grailsでドメイン駆動設計を実践する時の勘所
PDF
JGGUG Community LT 2016
PDF
Spock's world
PDF
スーパー戦隊進化論
KEY
Gws in fukuoka
PDF
Devsumi2012 JGGUG LT
PDF
Spockを使おう!
PDF
G*Magazineを読もう
PDF
G*におけるソフトウェアテスト・シーズンIII
PDF
Groovyノススメ
「普通の設計」をするということ
バックエンドのエンジニアがiOSアプリ開発をやってみて思うこと - フロントエンドのアーキテクチャの考察 -
『現場で役立つシステム設計の原則』は一般的なSI現場で役立つのか?
Grailsでドメイン駆動設計を実践する時の勘所
JGGUG Community LT 2016
Spock's world
スーパー戦隊進化論
Gws in fukuoka
Devsumi2012 JGGUG LT
Spockを使おう!
G*Magazineを読もう
G*におけるソフトウェアテスト・シーズンIII
Groovyノススメ

Jjug 20140430 gradle_basic