ねこじゃすり
猫を魅了する魔法の装備品!
Anker PowerCor
旅行には必須の大容量モバイルバッテリー!
【最新機種】GoPro hero11 Black
最新機種でVlogの思い出を撮影しよう!
[ノースフェイス] THE NORTH FACE メンズ アウター マウンテンライトジャケット
防水暴風で耐久性抜群なので旅行で大活躍です!
レッドブル エナジードリンク 250ml×24本
翼を授けよう!
モンスターエナジー 355ml×24本 [エナジードリンク]
脳を活性化させるにはこれ!
サンディスク microSD 128GB
スマホからSwitchまで使える大容量MicroSDカード!
スポンサーリンク
目次
いろんなライブラリを試作的に試したい
システム開発をしていると、その実装タイミングごとにライブラリやフレームワークのバージョンが変わっていたり新旧ライブラリがあったりと、どれを使えば良いか?や、使う際のメリット/デメリットが無いか?などの選定をしっかり行う必要があります。
ここをおろそかにして、「とりあえず使ってみるか。」と安易な気持ちで判断してしまうと、プロジェクトの後半で該当ライブラリ等を差し替えないといけない事になり炎上プロジェクト化する恐れがあります。
そんな悲劇を迎えないためには、事前にローカル環境でサンプルプログラムを書いてみて問題無い事を確認するのですが、Javaの場合、コマンドラインベースだと外部ライブラリの管理や更新がとてもめんどくさいので、Gralde
を使ってサンプル用のローカルプロジェクトを作っておくと簡単にライブラリの追加や管理、実行を行う事が出来ます。
脱xml
今ではJavaシステムを開発する際に、過去のビルドツールであるant
やmaven
、pom
を選ぶ事はほとんど無いと言っても良いでしょう。
それらのツールはどれもxml
で管理をするのですが、xml形式だと記述量が多くなったり、可読性がとても低くなってしまします。
少なくとも筆者はxml形式に対して、
とてつも無い拒否反応を示す体質
です。笑
Gradle
であれば、スクリプト形式で記述する事が可能なので可読性もよくなり、最小限の記述で済みます。
アンドロイドアプリの開発でも活躍
また、最近ではアンドロイドアプリの開発でもGradle
が標準化されています。
ここでGradle
を使えるようになっておけば、エンジニアとしても幅が広がるのでオススメです♪
手順
Gradleのインストール
まずはGradle本体をインストールしましょう。
例の如く、Homebrew
でサクッとインストールします。
1 |
brew install gradle |
以下のログが出ればインストール完了です。
1 2 3 4 |
==> Downloading https://services.gradle.org/distributions/gradle-4.10.2-all.zip ==> Downloading from https://downloads.gradle.org/distributions/gradle-4.10.2-all.zip ######################################################################## 100.0% 🍺 /usr/local/Cellar/gradle/4.10.2: 203 files, 83.7MB, built in 3 minutes 51 seconds |
確認
以下のコマンドが動くか確認してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
------------------------------------------------------------ Gradle 4.10.2 ------------------------------------------------------------ Build time: 2018-09-19 18:10:15 UTC Revision: b4d8d5d170bb4ba516e88d7fe5647e2323d791dd Kotlin DSL: 1.0-rc-6 Kotlin: 1.2.61 Groovy: 2.4.15 Ant: Apache Ant(TM) version 1.9.11 compiled on March 23 2018 JVM: 1.8.0-adoptopenjdk (Oracle Corporation 25.71-b00) OS: Mac OS X 10.11.3 x86_64 |
正常に動いていますね。
参考
プロジェクトの作成
では、サンプル用のプロジェクトを作成しましょう。
プロジェクト用のディレクトリを作成したら、その中に入り以下のコマンドを実行してください。
1 |
gradle init --type java-application |
すると数秒で以下のようなログが出力されます。
1 2 3 4 |
Starting a Gradle Daemon, 10 busy Daemons could not be reused, use --status for details BUILD SUCCESSFUL in 1s 2 actionable tasks: 2 executed |
ディレックトリ構造を確認すると、以下のようにJava開発のプロジェクトのひな壇が生成されている事がわかります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
. . ├── build.gradle ├── gradle │ └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src ├── main │ └── java │ └── App.java └── test └── java └── AppTest.java |
確認
では、テンプレートで作成されたプロジェクトをビルドしてみましょう。
作成されたプロジェクトにはGradleラッパーと呼ばれる実行スクリプトが用意されています。
- gradlew ← linux用シェル
- gradlew.bat ← Windows用バッチ
なので、基本的にはgradlew
を使って実行する事になります。
筆者はmac
なので以下の様になります。
1 |
./gradlew build |
これはbuild
というタスクを呼び出して実行しています。gradle
には基本的なビルドや起動、ライブラリインストールなのどの汎用的に使われるものはデフォルトで用意されています。
詳しくはコチラをみてください。
実行結果は以下の通りになると思います。
1 2 |
BUILD SUCCESSFUL in 52s 4 actionable tasks: 4 executed |
内部的には以下の順番で各タスクが事項さrています。
- :compileJava
- :processResources
- :classes
- :jar
- :startScripts
- :distTar
- :distZip
- :assemble
- :compileTestJava
- :processTestResources
- :testClasses
- :test
- :check
- :build
ではビルドが通ったので、実際にJavaプログラムを動かしましょう。
以下のコマンドを実行してみてください。
1 |
./gradlew run |
以下の様にApp.java
の処理結果が出力されていれば成功です。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/* * This Java source file was generated by the Gradle 'init' task. */ public class App { public String getGreeting() { return "Hello world."; } public static void main(String[] args) { System.out.println(new App().getGreeting()); } } |
1 2 3 4 5 |
> Task :run Hello world. BUILD SUCCESSFUL in 1s 2 actionable tasks: 1 executed, 1 up-to-date |
正常にお約束のHello world.が出力されましたね♪
ユニットテスト
生成されたプロジェクトはJUnit
を用いたユニットテストを考慮したプロジェクト構造になっており、上記の通りbuild
タスクを実行すれば自動で実行もされているのでとても助かりますね♪
試しにユニットテストが失敗する形にして実行してみましょう。
現在はメソッドのNotNull
チェックをしているので、一時的にnull
を返す様にすればよさそうですね。
1 2 3 4 5 6 7 8 9 10 11 12 |
/* * This Java source file was generated by the Gradle 'init' task. */ import org.junit.Test; import static org.junit.Assert.*; public class AppTest { @Test public void testAppHasAGreeting() { App classUnderTest = new App(); assertNotNull("app should have a greeting", classUnderTest.getGreeting());// Nullを返せばNGになりそう } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/* * This Java source file was generated by the Gradle 'init' task. */ public class App { public String getGreeting() { //return "Hello world."; return null; } public static void main(String[] args) { System.out.println(new App().getGreeting()); } } |
確認
では、もう一度実行してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
> Task :test FAILED AppTest > testAppHasAGreeting FAILED java.lang.AssertionError at AppTest.java:10 1 test completed, 1 failed FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':test'. > There were failing tests. See the report at: file:///Users/blogenist/tmp/work/java/gradleSample/build/reports/tests/test/index.html * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights. * Get more help at https://help.gradle.org BUILD FAILED in 2s 7 actionable tasks: 5 executed, 2 up-to-date |
どのタスクでどの様なエラーが発生したかが出力されているのでとても親切ですね♪
ちなみにユニットテストのレポートも自動で生成してくれます。
カスタマイズやユニットテスト用のプラグインなども充実しているので、そのうち記事にするかもしれませんが、皆さんも興味があるなら調べてみてください。
ライブラリの追加
では、外部ライブラリを使える様にしてみましょう。
ライブラリの管理はbuild.gradle
と言うファイルで管理します。
このファイルの中のdependencies
の中に依存ライブラリをどんどん追加していく方になります。
今回はJackson
を入れてみます。
1 2 3 4 5 6 7 8 |
dependencies { // This dependency is found on compile classpath of this component and consumers. compile 'com.google.guava:guava:23.0' compile "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.7" // 追加 // Use JUnit test framework testCompile 'junit:junit:4.12' } |
では、クラスファイルの方もJackson
を使う様に修正してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
/* * This Java source file was generated by the Gradle 'init' task. */ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.core.JsonProcessingException; public class App { public String getGreeting() { return "Hello world."; } public static void main(String[] args) throws JsonProcessingException { ObjectMapper objectMapper = new ObjectMapper();; Person taro = new Person("taro", 25); String jsonString = objectMapper.writeValueAsString(taro); System.out.println(jsonString); } public static class Person{ private String name; private int age; public Person(String name, int age){ this.name = name; this.age = age; } public String getName(){ return name; } public int getAge(){ return age; } } } |
確認
では、以下のコマンドを実行してみてください。
1 |
./gradlew run |
ライブラリのダウンロードが走るのでちょっと実行時間がかかりますが、以下の様にJson文字列が出力されていれば成功です。
1 2 3 4 5 |
> Task :run {"name":"taro","age":25} BUILD SUCCESSFUL in 1s 2 actionable tasks: 2 executed |
とても簡単ですね♪
終わりに
以上の様にコマンドベースで簡単にGradleプロジェクトの環境を整えることが出来ました。
Gradleはまだまだ数年は現役で走り続けるビルドツールだと思いますので、是非この機会に覚えてみてください♪