gws 20141024 gradle_intro
DESCRIPTION
Gradle introduction and latest update for G*WorkshopZ 2014/10/24 (Japanese)TRANSCRIPT
2014.10.24 須江信洋(@nobusue)
http://nobusue.hatenablog.com/ https://www.facebook.com/nobuhiro.sue
G*ワークショップZ Oct 2014Gradleイントロダクション&最新動向(~2.1)
2
自己紹介} 須江 信洋(すえ のぶひろ)
} Twitter: @nobusue } https://www.facebook.com/nobuhiro.sue
} 約10年ほどJavaEE関連の仕事をしてました } 2013年10月よりフリーランス(個人事業主)
} 最近のお仕事 } IoT(Internet of Things)のサービス基盤構築 } AWS / Cloudera Manager / CDH } Spark / Kafka / OpenTSDB / MongoDB / RStudio } Groovy / Gradle / SBT / Maven / Jenkins / Vagrant
3
Gradleイントロダクション
Gradleとは?} Groovyベースのビルドツール
} クロスプラットフォーム (JavaVM上で動作) } Groovyスクリプトでビルドを記述(no more XML) } ビルド記述を簡潔にするDSLを提供
} 規約と柔軟性の適切なトレードオフ } Ant: 柔軟だが、自由すぎて非効率的 } Maven: 規約による効率化、しかし融通が効かない } Gradle: 規約はあるがカスタマイズ可能
} 既存資産の有効活用 } Antタスクやビルド定義をそのまま再利用 } Maven/Ivyリポジトリを利用可能 } ビルドスクリプト内でJavaライブラリを直接利用可能
4
http://gradle.org/
Gradleのビルドスクリプト(例)
5
apply plugin: 'java' repositories { jcenter() } dependencies { compile ‘org.slf4j:slf4j-api:1.7.5’ testCompile ‘junit:junit:4.11’ }
Javaプラグインを適用
依存性解決に jCenter(Bintray)を利用
プロダクトコードの依存ライブラリ
テストコードの依存ライブラリ
規約
} Javaプラグインの(デフォルト)タスク依存関係
6
あくまでデフォルトであり、自由にカスタマイズ可能
Antのビルドスクリプト(例)
7
<project name="java-project" basedir="."> <property name="build.dir" value="build"/> <property name="main.src.dir" value="src/main/java"/> <property name="main.classes.dir" value="${build.dir}/classes/main"/> <property name="test.src.dir" value="src/test/java"/> <property name="test.classes.dir" value="${build.dir}/classes/test"/> <property name="test.results.dir" value="${build.dir}/test-results"/> <property name="reports.dir" value="${build.dir}/reports/tests"/> <property name="jar.dir" value="${build.dir}/lib"/> <path id="junit"> <pathelement location="lib/junit-4.11.jar"/> <pathelement location="lib/hamcrest-core-1.3.jar"/> </path> <target name="clean"> <delete dir="${build.dir}"/> </target> <target name="compile"> <mkdir dir="${main.classes.dir}"/> <javac srcdir="${main.src.dir}" destdir="${main.classes.dir}" includeantruntime="false"/> </target> <target name="jar" depends="compile"> <mkdir dir="${jar.dir}"/> <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${main.classes.dir}"/> </target>
<target name="testCompile"> <mkdir dir="${test.classes.dir}"/> <javac srcdir="${test.src.dir}" destdir="${test.classes.dir}" includeantruntime="false"> <classpath> <path refid="junit"/> <path location="${jar.dir}/${ant.project.name}.jar"/> </classpath> </javac> </target> <target name="junit" depends="jar,testCompile"> <mkdir dir="${test.results.dir}"/> <junit printsummary="yes"> <classpath> <path refid="junit"/> <path location="${jar.dir}/${ant.project.name}.jar"/> <path location="${test.classes.dir}"/> </classpath> <formatter type="xml"/> <batchtest todir="${test.results.dir}"> <fileset dir="${test.classes.dir}"/> </batchtest> </junit> </target> <target name="junitreport" depends="junit"> <mkdir dir="${reports.dir}"/> <junitreport todir="${reports.dir}"> <fileset dir="${test.results.dir}" includes="TEST-*.xml"/> <report todir="${reports.dir}"/> </junitreport> </target> </project>
Gradle DSL} Gradleが独自に定義する「ビルド」記法 } build.gradleで記述する apply / repositories /
dependencies など } GroovyのMOPなどを利用して定義
} DSLの解釈 } apply / repositories / dependenciesの実体はメソッド
} 引数のカッコを省略している(Groovyの記法) } {} の部分はGroovyのクロージャ
} メソッドのレシーバはGradleが提供するドメインオブジェクト
8
Gradleインストール方法} 前提
} JDK 6以上 } GVM利用
} curl -s get.gvmtool.net | bash } gvm install gradle } 詳細は http://gvmtool.net/ 参照(Windowsの場合は
Cygwinが必要) } ZIPを展開
} http://www.gradle.org/downloads } 適当なディレクトリに展開 ($GRADLE_HOME) } $GRADLE_HOME/bin にパスを通しておく
9
動作確認
} gradle -v
10
GVMでインストールした場合は ~/.gvm/gradle/<version> 以下に導入され、 ~/.gvm/gradle/current にシンボリックリンクが作成されます
11
Gradle最新動向(~2.1)
Gradle2.0~2.1の主要アップデート} Gradle2.0
} メジャーバージョンアップに伴うアーキテクチャの整理と 古い機能の改廃
} ベースのGroovyの最新化 (1.8.6 → 2.3.2) } Java 8サポート
} Ivy / Maven リポジトリへのSFTP接続サポート
} Gradle2.1
} ベースのGroovyの最新化 (2.3.2 → 2.3.6) } plugins ブロックとプラグインポータルによりプラグイン適用が容易に
} プラグイン開発プラグイン(java-gradle-plugin)の追加
} Javaソースのインクリメンタルコンパイル対応
} exclude 指定をmaven-publishプラグインが発行するPOMに反映
} ビルドによって生成されるコンポーネントの詳細情報表示タスク(components)の追加
12
コミュニティプラグイン適用(~2.0)
13
buildscript { repositories { jcenter() } dependencies { classpath "com.bmuschko:gradle-tomcat-plugin:2.0" } } apply plugin: "com.bmuschko.tomcat"
コミュニティプラグイン適用(2.1~)
14
plugins { id "com.bmuschko.tomcat" version "2.0" }
プラグインポータルに登録されていることが前提
Gradleプラグインポータル
15
http://plugins.gradle.org/
インクリメンタルコンパイル対応
} 変更のあったJavaソースのみ再コンパイル } 2.0までは、ソースセットに含まれるJavaソースのうち
一つでも変更があれば、全体を再コンパイル } 2.1では再コンパイルを必要最小限に } Antのjavacタスクをやめ、Gradle独自コンパイラへ } デフォルトでは無効化されている
} インクリメンタルコンパイルの効果 } ビルド時間短縮 } バイトコード処理や動的クラスリロードを行う場合
の影響範囲の最小化
16
インクリメンタルコンパイル有効化} ビルドスクリプト or 初期化スクリプトに追記
} 初回ビルド時にクラス解析データを記録し、以降は差分をチェックする
17
allprojects { tasks.withType(JavaCompile) { options.incremental = true } }
18
参考情報
Gradle関連情報} Gradleドキュメント } http://www.gradle.org/documentation
} Gradleドキュメント(日本語翻訳版) } http://gradle.monochromeroad.com/docs/index.html
⇒公式ドキュメントに移行予定です
} サンプルコード } gradle-x.x-all.zipの”samples/”以下
} ソースコード } https://github.com/gradle/gradle
19
20
http://www.pixiv.net/member_illust.php?mode=medium&illust_id=4167445
21
次は 「Gradleハンズオン基礎編」
です