Spring in-summer-gradle-hands on-withanswers

  • View
    1.054

  • Download
    0

  • Category

    Software

Preview:

Citation preview

今日から始める 入門ハンズオン

2015.08.28 Spring in Summer R3-2 #jsug_sis #jggug

受講対象者• これからGradleを始める予定の人

• Gradleを始めたばかりの人

• Gradleに興味がある人

• pom地獄から脱出したい人Gradle初心者向けの内容となっています。 それなりに使っている方は、今からでも

裏セッションに移動することをお勧めします。

アジェンダ

• イントロダクション

• 超速Gradle入門

• ハンズオン

• Q&A

イントロダクション

ハンズオン資料のコピー• USBを前から回しています。以下をマシンにコピーし、Gradle-Hands-on/README.txt を読んでセットアップを行ってください。

• [必須]:Gradle-Hands-on

• [任意]:JDK8-<OS-xxbit>

• JDKインストールしていない人のみ

自己紹介• 綿引 琢磨(わたびき たくま)

• 株式会社デライトテクノロジーズ 代表取締役

• JGGUG運営委員

• @bikisuke

• 共著『Gradle徹底入門』

「徹底入門」というタイトルにふさわしい内容http://www.amazon.co.jp/product-reviews/4798136433/ref=dp_db_cm_cr_acr_txt?ie=UTF8&showViewpoints=1

これまで手厚くサポートされたビルドツールの本を見たことがありませんでした。http://grimrose.blogspot.jp/2014/12/gradle.html

これ1冊あればググる必要ないのではという安心感があるhttp://booklog.jp/item/1/4798136433

Gradle”感じる徹底ぶりで、一読の価値ありです。http://lino.hatenablog.jp/entry/gradleintroduction

「入門」とあるけど、きちんとアーキテクチャから解説されているので、十分な知識が得られるだろう。http://www.ruimo.com/2015/01/12/1421066460000.html

内容が濃いhttp://www.amazon.co.jp/review/R1UIVFAYX4GEVR/ref=cm_cr_dp_title?ie=UTF8&ASIN=4798136433&channel=detail-glance&nodeID=465392&store=books

絶賛発売中会場後

ろにて

アンケート1• Q. 現在、何でビルドしていますか?

1. Antでビルドしている

2. Mavenでビルドしている

3. eclipseがやってくれてます

4. もちろん javac です

5. その他

アンケート2• Q. Gradleへの移行を検討していますか?

1. すぐに移行する予定

2. 移行に不安があり、決め兼ねている

3. 今日のハンズオン次第で考えたい

4. 今のところ予定はない

5. XMLが大好物なのでありえない

アンケート3• Q. Gradleへの移行の障壁は何ですか?

1. お客様や上司の説得

2. 社内にデキるエンジニアがいない

3. 今のビルドスクリプトが難解

4. 漠然とした不安感

5. その他

超速Gradle入門

Gradleとは• OSSの自動化ツール(Apache License 2.0)

• 他のツールより優れている(点が多い)

• ビルドスクリプトはGroovy DSLで記述

• 拡張しやすいアーキテクチャを採用

• 最新バージョンは2.6(2015年8月時点)

主な特徴• ビルドスクリプトが簡潔かつ柔軟

• プラグインを作りやすい

• マルチプロジェクトを扱いやすい

• 既存ビルドツールの資産を活用できる

• さまざまな言語に対応

• Gradleラッパーが便利

簡潔さと柔軟さ• 実行単位の「タスク」を柔軟に記述

• 既存タスクの拡張も可能

• Groovy DSLで記述することで実現

• XMLではあり得ない簡潔さ

• ビルドスクリプトの記述はGroovyのコードとして実行される

• Javaのコードを直接書くことも可能

柔軟な記述task hello << { println ‘Hello, Gradle’}

タスクの定義

柔軟な記述task hello << { println new Messenger().greet(‘Gradle’)}

public class Messenger { private String message = “Hello, “; public String greet(String name) { return message + name + “!”; }}

スクリプト内でクラスを定義することも可能

作りやすいプラグイン• プラグイン作成の敷居が低い

• 用途に応じてプラグインも柔軟に

• ビルドスクリプトに直接

• buildSrcプロジェクトとして

• プラグインモジュールとして

マルチプロジェクト• 設定スクリプトでプロジェクト管理

• 2つのレイアウトをサポート

• 階層型レイアウト

• フラット型レイアウト

• ビルド定義の記述場所も柔軟に

既存ツールの資産活用• Ant

• build.xmlを実行可能

• Maven/Ivy

• MavenやIvyのリポジトリを利用可能

マルチ言語対応• JVM

• Java, Groovy, Scala

• Android

• Android Studio のビルドツールとして採用

• Native

• C, C++, Objective-C, など

• その他

• C#(コミュニティプラグイン)など

Gradleラッパー• ユーザーによる明示的なインストールや設定をせずにビルド実行を可能に

• 一元的な実行環境の管理と配布により、さまざまな用途に利用可能

• 独自設定を施したGradleの展開

• ツールの実行ランチャーとして

はじめてのGradle

• 基本の3ステップ

• Gradleのインストール

• ビルドスクリプトの作成

• ビルドの実行

Gradleのインストール• 前提条件: JDK6以上(JDK8推奨)

• Mac/Unix系:GVMが便利

•http://gvmtool.net/ • $ gvm i gradle

• Windows: 公式サイトからダウンロード

•http://www.gradle.org/downloads • ZIP解凍して、環境変数Pathに<GRADLE_HOME>\bin

GVMによるインストール$ gvm i gradle

Downloading: gradle 2.6

% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 354 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 100 62.4M 100 62.4M 0 0 3495k 0 0:00:18 0:00:18 --:--:-- 4370k

Installing: gradle 2.6 Done installing!

Do you want gradle 2.6 to be set as default? (Y/n): Y

Setting gradle 2.6 as default.

ビルドスクリプトの作成• 「build.gradle」というファイルをプロジェクト直下に作成し、各種定義を記述

• プラグイン

• コンフィグレーション

• 依存関係解決

• タスク

• etc.

ビルドの実行• gradleコマンドに実行したいタスクを指定

• gradle <タスク> ...

• コマンドライン引数でログレベル変更可能

• -i : info

• -q : quiet

• -d : debug

• -s : stacktrace

ハンズオン

#0: ウォーミングアップ

#0 動作確認

1. 環境準備(終わってない方)

2. バージョン情報の表示

3. タスク一覧の表示

環境準備• JDKを入れていない人はJDKインストールと環境変数の設定をしてください。

• Gradleは任意の場所に格納し、環境変数を設定してください。

• 新しくコマンドシェルまたはコマンドプロンプトを開いてください。

• 「repository-manager」ディレクトリに移動し、 「gradle setupRepos」を実行してください。

バージョン情報の表示• バージョン情報を表示するには以下のオプションを指定して、Gradleを実行します。

‣ gradle -v (もしくは --version)

• Gradleのバージョンの他、GroovyやAnt, JVM, OS などの情報が出力されていることを確認してください。

タスク一覧の表示• タスク一覧を表示するには以下のGradleタスクを実行します。

‣ gradle tasks

• 実行可能なタスクの一覧一覧が表示されることを確認してください。

#0 補足説明

#0-2 タスク一覧の表示•Gradle には、予め使用可能なタスクが用意されています。これらは「組み込みタスク(built-in task)」呼びます。

•タスクは所属するグループ別に一覧表示され、説明(description)が設定されている場合には説明も表示されます。

•ビルドスクリプトで定義したタスクや使用するプラグインに含まれるタスクもこのタスク一覧に表示されます。

#1: はじめてのGradle

#1-1 プロジェクトの作成とビルド

1. ディレクトリの移動

2. initタスクの実行

3. build.gradleの修正

4. ビルドの実行

5. ビルド成果物の確認

ディレクトリの移動• <HANDS-ON_HOME>/work1/create-and-buildに移動します。

• ディレクトリ内に何もファイルがないことを確認してください。

initタスクの実行• 組み込みタスクであるinitタスクを以下のタスクオプションを指定して実行します。

‣ gradle init --type java-library

• 「BUILD SUCCESSFUL」となることを確認してください。

• ファイルやディレクトリが自動生成されていることを確認してください。

build.gradleの修正• テキストエディタでbuild.gradleを開き、以下の修正を行います。

‣ 17行目 jcenter() をコメントアウト

‣ 18行目 mavenLocal() を追加

ビルドの実行• buildタスクを実行します。

‣ gradle build

• 「BUILD SUCCESSFUL」となることを確認してください。

ビルド成果物の確認• <HANDS-ON_HOME>/work1/create-and-build/buildに移動し、以下のディレクトリのファイルを確認します。

• libs

• reports

• ディレクトリ内に何もファイルがないことを確認してください。

#1-1 補足説明

#1-1-2 initタスク•組み込みタスクのひとつ

•プロジェクトやビルドスクリプトの自動生成を行う

•生成したい内容に応じてタスクオプションを指定する

•basic : ビルドスクリプト、Gradleラッパー生成

•groovy-library : basic + Groovy規約ディレクトリ生成

•java-library : basic + Java規約ディレクトリ生成

•pom : pom.xmlを基に生成

•scala-library : basic + Scala規約ディレクトリ生成

#1-1-3 repositoriesの修正•「repositories」には、依存関係を解決する際に参照するリポジトリの設定を行います。

•外部のリポジトリを参照する場合は以下のように指定します。

•mavenCentral() // Mavenセントラル

•jcenter() // initタスクのデフォルト

•本タスクでは、今回ネットワーク未接続の環境のため、ローカルのファイルリポジトリを参照するように修正しましたが、ネットワークがあれば修正は不要です。

#1-1-5 ビルド成果物の確認•ビルドの実行により作成された成果物は、<PROJECT_HOME>/buildディレクトリに置かれます。

•build/classes : main及びtestのクラスファイル

•build/libs : JARファイルやWARファイル等

•build/reports : テスト結果を集計したHTMLファイル

•build/resources : main及びtestのリソースファイル

•build/test-results : テスト結果

#1-2 既存プロジェクトへの適用1. ディレクトリの移動

2. initタスクの実行

3. build.gradleの修正

4. ビルドの実行

5. WARファイルのデプロイ

6. アプリの動作確認

ディレクトリの移動• <HANDS-ON_HOME>/work1/migrate-from-mavenに移動します。

• ディレクトリ内にsrcとpom.xmlファイルがあることを確認してください。

initタスクの実行• initタスクをタスクオプションなしで実行します。

‣ gradle init

• 「BUILD SUCCESSFUL」となることを確認してください。

• ビルドスクリプやGradleラッパーが自動生成されていることを確認してください。

build.gradleの修正• テキストエディタでbuild.gradleを開き、以下の修正を行います。

‣ 1行目 apply plugin ‘java’ をコメントアウト

‣ 2行目 apply plugin ‘war’ を追加

‣ 10,11行目 「1.5」を「1.8」に変更

‣ 17行目 maven {} をコメントアウト

‣ 18行目 mavenLocal() を追加

‣ 23行目に war { を追加

‣ 24行目に baseName = ‘helloApp’ を追加

‣ 25行目に version = ‘’ を追加

‣ 26行目に } を追加

ビルドの実行• buildタスクを実行します。

‣ gradle build

• 「BUILD SUCCESSFUL」となることを確認してください。

• build/libsディレクトリにWARファイルが作成されることを確認してください。

WARファイルのデプロイ• 作成したhelloApp.warをTomcatにコピーします。

• cd build/libs/helloApp.war <HANDS-ON_HOME>/tomcat/webapps/

• tomcat/webapps直下にWARファイルがコピーされていることを確認してください。

アプリの動作確認• Tomcatを起動し、ブラウザから以下のアドレスにアクセスします。

• Tomcatの起動シェル: tomcat/bin/start.sh(start.bat)

• http://localhost:8080/helloApp/

• ブラウザに「Hello!!!!」と表示されることを確認してください。

#1-2 補足説明

#1-2-2 initタスク

•コマンドを実行する場所にpom.xmlが存在する場合は、タスクオプションなしで「--type pom」と同様の自動生成を行います。

•pomベースで生成される場合は、対応可能な定義のみpom.xmlの内容を変換してbuild.gradleに反映されます。

#1-2-3 build.gradleの修正•GradleはMavenのディレクトリ規約を踏襲しているため、変更することなく、そのまま適用できます。

•pom.xmlの<packaging>の内容は反映されないため、JAR以外の場合はプラグインを変更する必要があります。

•Mavenのprovidedスコープは、GradleではWarプラグインの設定のため、Javaプラグインでは使用することができません。

#2: プラグインの使い方

プラグインとは• Gradleのビルド機能を拡張する仕組み

• ほとんどの機能はプラグインによって提供されている

• 通常、プラグインによって「タスク」「プロパティ」「規約」などが追加される

• Gradleのプラグインは主に3種類に分類される

• 標準プラグイン

• コミュニティプラグイン

• カスタムプラグイン

プラグインの記述// 従来の記述方法apply plugin: ‘<プラグインID>’

// Gradle2.1からの記述方法plugins { id ‘<プラグインID>’

}

標準プラグインカテゴリ プラグイン名 プラグインID 概要

言語 Javaプラグイン javaJavaプロジェクトのビ

ルド機能

言語 Groovyプラグイン groovyGroovyプロジェクトの

ビルド機能

統合 Applicationプラグイン application Javaプロジェクトのビルドとコマンドライン実行機能

統合 Warプラグイン war JavaプロジェクトのビルドとWARファイル生成機能

開発 Checkstyleプラグイン checkstyleJavaソースの静的解析とレポート出力機能

開発 PMDプラグイン pmdJavaソースの静的解析とレポート出力機能

コミュニティプラグインカテゴリ プラグイン名 プラグインID 概要

統合 Tomcatプラグイン com.bmuschko.tomcat 組み込みTomcatの起動停止やデプロイ機能

言語 SSHプラグイン org.hidetake.ssh SSHによるコマンド実行やファイル転送機能

統合 Bintrayプラグイン com.jfrog.bintray Bintrayへのアーティファクト発行機能

統合 Spring-Boot プラグイン spring-boot Spring-boot実行機能

カスタムプラグインapply plugin: HelloPlugin

class HelloPlugin implements Plugin<Project> { void apply(Project project) { project.task(‘hello’) << { println ‘Hello, Gradle!’ } }}

#2-1 Javaプラグイン

1. ディレクトリの移動

2. タスク詳細の確認

3. タスクの実行と確認

ディレクトリの移動• <HANDS-ON_HOME>/work2/java-pluginに移動します。

• ディレクトリ内にsrcとbuild.gradleファイルがあることを確認してください。

タスク詳細の確認• タスク一覧およびヘルプを表示して、タスクの詳細情報を確認します。

‣ gradle tasks --all

‣ gradle help --task <タスク>

• タスクの定義方法のスライドを参考に定義してください。

タスクの実行と確認• 定義したタスクを実行します。

‣ gradle <タスク名>

• 「BUILD SUCCESSFUL」となることを確認してください。

• 期待通りの結果が出力されていることを確認してください。

#2-2 Warプラグイン

1. ディレクトリの移動

2. タスク詳細の確認

3. タスクの実行と確認

ディレクトリの移動• <HANDS-ON_HOME>/work2/war-pluginに移動します。

• ディレクトリ内にsrcとbuild.gradleファイルがあることを確認してください。

タスク詳細の確認• タスク一覧およびヘルプを表示して、タスクの詳細情報を確認します。

‣ gradle tasks --all

‣ gradle help --task <タスク>

• タスクの定義方法のスライドを参考に定義してください。

タスクの実行と確認• 定義したタスクを実行します。

‣ gradle <タスク名>

• 「BUILD SUCCESSFUL」となることを確認してください。

• 期待通りの結果が出力されていることを確認してください。

#2-3 Applicationプラグイン

1. ディレクトリの移動

2. タスク詳細の確認

3. タスクの実行と確認

ディレクトリの移動• <HANDS-ON_HOME>/work2/app-pluginに移動します。

• ディレクトリ内にsrcとbuild.gradleファイルがあることを確認してください。

タスク詳細の確認• タスク一覧およびヘルプを表示して、タスクの詳細情報を確認します。

‣ gradle tasks --all

‣ gradle help --task <タスク>

• タスクの定義方法のスライドを参考に定義してください。

タスクの実行と確認• 定義したタスクを実行します。

‣ gradle <タスク名>

• 「BUILD SUCCESSFUL」となることを確認してください。

• 期待通りの結果が出力されていることを確認してください。

#3: タスクの定義

タスクとは

• Gradleで実行する処理の単位

• 内部的には「actions」というプロパティで実行処理を管理している

• タスク間に依存関係を持たせたり、実行順を制御したりすることが可能

タスクの定義方法// 最もシンプルな記法task <タスク名> << {

// タスク処理}

// 例task hello << { println ‘Hello, Gradle!’}

タスクの定義方法// 前と似ているが異なる記法task <タスク名> {

// タスクの設定 <タスクAPI> { // タスクの処理 }

}

// 例task hello { description = ‘helloタスクです’

doLast { println ‘Hello, Gradle!’ }}

タスクの定義方法// Gradle標準の汎用タスクを使用した記法task <タスク名>(type: <汎用タスク>) {

// タスク処理}

// 例task myDelete (type: Delete) { delete ‘trash/files’}

#3-1 タスクの作成

1. ディレクトリの移動

2. タスクの定義

3. タスクの実行と確認

ディレクトリの移動• <HANDS-ON_HOME>/work3/task-definitionsに移動します。

• ディレクトリ内にbuild.gradleファイルがあることを確認してください。

タスクの定義• build.gradleをエディタで開き、コメントに従って、各タスクを定義します。

‣ コメント参照

• タスクの定義方法のスライドを参考に定義してください。

タスクの実行と確認• 定義したタスクを実行します。

‣ gradle <タスク名>

• 「BUILD SUCCESSFUL」となることを確認してください。

• 期待通りの結果が出力されていることを確認してください。

#3-1: 回答例

/** * 3-1-1. 「Hello, Gradle!」と出力するHelloタスクを作成してください。 * 出力には「println '文字列'」が使えます。 */task Hello << { println 'Hello, Gradle!'}

/** * 3-1-2. 3-1-1で作成した「Helloタスク」と同じ処理をdoLastを使った *「Hello2タスク」として作成してください。 */task Hello2 { doLast { println 'Hello, Gradle!' }

build.gradle(1/2)

/** * 3-1-3. 「from/resource.txt」を「to」ディレクトリにコピーしてください。 * ファイルのコピーには Copyタスクを使用できます。 * task xxx(type: Copy) { * from 'コピー元'

* into 'コピー先'

* } */

task myCopy(type: Copy) { from 'from/resource.txt' into 'to'}

build.gradle(2/2)

タスクの制御• 依存関係

• 依存するタスクがある場合、実行時に依存関係を遡って各タスクを実行する

• 順序付け

• 順序付けされているタスクが、同時に実行タスクとして指定された場合は、順序に従って各タスクを実行する

• ファイナライザータスク

• ファイナライズドタスクが実行タスクとして指定された場合、最後にファイナライザータスクを実行する

依存関係の定義方法task TASK_A << { // タスク処理}

task TASK_B << { // タスク処理}

// TASK_B は TASK_A に依存しているTASK_B.dependsOn TASK_A

順序付けの定義方法task TASK_A << { // タスク処理}

task TASK_B << { // タスク処理}

// TASK_B は TASK_Aの後に実行されるTASK_B.mustRunAfter TASK_ATASK_B.shouldRunAfter TASK_A

ファイナライザーの定義方法task TASK_A << { // タスク処理}

task TASK_B << { // タスク処理}

// TASK_A のファイナライザータスクとして TASK_Bを定義TASK_A.finalizedBy TASK_B

#3-2 タスクの制御

1. ディレクトリの移動

2. タスクの定義

3. タスクの実行と確認

ディレクトリの移動• <HANDS-ON_HOME>/work3/ordering-tasksに移動します。

• ディレクトリ内にbuild.gradleファイルがあることを確認してください。

タスクの定義• build.gradleをエディタで開き、コメントに従って、各タスクを定義します。

‣ コメント参照

• タスクの定義方法のスライドを参考に定義してください。

タスクの実行と確認• 定義したタスクを実行します。

‣ gradle <タスク名>

• 「BUILD SUCCESSFUL」となることを確認してください。

• 期待通りの結果が出力されていることを確認してください。

#3-2: 回答例

/** * 3-2-1. 「TODO」「DOING」「DONE」と出力するToDoタスク、Doingタスク、Doneタスクを作成してください。 */task ToDo << { println ‘TODO' }

task Doing << { println 'DOING'}

task Done << { println ‘DONE' }

/** * 3-2-2. ToDoタスク、Doingタスク、Doneタスクに依存関係を持たせて、 *「TODO」「DOING」「DONE」の順に出力させてください。 *///Done.dependsOn Doing//Doing.dependsOn ToDo

build.gradle(1/2)

/** * 3-2-3. 「mustRunAfter」もしくは「shouldRunAfter」を使用して *「TODO」「DOING」「DONE」の順に出力させてください。 */Done.mustRunAfter DoingDoing.mustRunAfter ToDo

/** * 3-2-4. 「ALL TASK FINISHED」と出力するFinishedタスクを追加し、 * Doneタスクのファイナライザータスクとして定義してください。 */task Finished << { println 'ALL TASK FINISHED'}Done.finalizedBy Finished

build.gradle(2/2)

#4: 応用編

#4 アプリ起動の自動化1. ディレクトリの移動

2. ビルドスクリプトの作成

3. タスクの定義

4. タスクの実行と確認

5. アプリの動作確認

ディレクトリの移動• <HANDS-ON_HOME>/work4/new-webappに移動します。

• ディレクトリ内にsrcとpom.xmlファイルがあることを確認してください。

タスクの定義• build.gradleをエディタで開き、次のタスクを定義します。

‣ WARファイルをtomcat/webappsにコピーするタスク

‣ Tomcatを起動させるタスク

• Tomcat起動タスクが必ずWARコピータスクの後で実行されるように順序付けしてください。

タスクの実行と確認• 定義したタスクを実行します。

‣ gradle deployWar startTomcat

• タスク実行前にTomcatが起動していたら、shutdown.sh(bat)で停止してください。

• 「BUILD SUCCESSFUL」となることを確認してください。

• 期待通りの結果になることを確認してください。

アプリの動作確認• ブラウザから以下のアドレスにアクセスします。

• http://localhost:8080/helloApp/

• ブラウザに「Hello!!!!」と表示されることを確認してください。

#4: 回答例

apply plugin: 'war'

sourceCompatibility = 1.8targetCompatibility = 1.8

repositories { mavenLocal()}

dependencies { compile group: 'org.springframework', name: 'spring-webmvc', version:'4.1.7.RELEASE' providedCompile group: 'javax.servlet', name: 'javax.servlet-api', version:'3.0.1'}

build.gradle(1/2)

war { baseName = 'helloApp' version = ''}

task deployWar(type: Copy) { from 'build/libs/helloApp.war' into '../../tomcat/webapps'

}task startTomcat(type: Exec) { workingDir '../../tomcat/bin' commandLine 'cmd', '/c', 'startup.bat'}deployWar.dependsOn buildstartTomcat.mustRunAfter deployWar

build.gradle(2/2)

Q&A

今日から始める 入門ハンズオン

2015.08.28 Spring in Summer R3-2 #jsug_sis #jggug