Featured image of post GradleでJavaライブラリの動作確認用プロジェクトを作る方法

GradleでJavaライブラリの動作確認用プロジェクトを作る方法

Javaライブラリの動作確認用プロジェクトをGradleでサクッと作る方法。HomebrewでのGradleのインストール、gradle initでのプロジェクト作成、ユニットテスト、Jacksonなどライブラリの追加と確認まで。xmlいらずです♪

2708文字

いろんなライブラリを試作的に試したい

システム開発をしていると、その実装タイミングごとにライブラリやフレームワークのバージョンが変わっていたり新旧ライブラリがあったりと、どれを使えば良いか?や、使う際のメリット/デメリットが無いか?などの選定をしっかり行う必要があります。

ここをおろそかにして、「とりあえず使ってみるか。」と安易な気持ちで判断してしまうと、プロジェクトの後半で該当ライブラリ等を差し替えないといけない事になり炎上プロジェクト化する恐れがあります。

そんな悲劇を迎えないためには、事前にローカル環境でサンプルプログラムを書いてみて問題無い事を確認するのですが、Javaの場合、コマンドラインベースだと外部ライブラリの管理や更新がとてもめんどくさいので、Graldeを使ってサンプル用のローカルプロジェクトを作っておくと簡単にライブラリの追加や管理、実行を行う事が出来ます。

脱xml

今ではJavaシステムを開発する際に、過去のビルドツールであるantmavenpomを選ぶ事はほとんど無いと言っても良いでしょう。

それらのツールはどれもxmlで管理をするのですが、xml形式だと記述量が多くなったり、可読性がとても低くなってしまします。
少なくとも筆者はxml形式に対して、
とてつも無い拒否反応を示す体質
です。笑

Gradleであれば、スクリプト形式で記述する事が可能なので可読性もよくなり、最小限の記述で済みます。

アンドロイドアプリの開発でも活躍

また、最近ではアンドロイドアプリの開発でもGradleが標準化されています。

ここでGradleを使えるようになっておけば、エンジニアとしても幅が広がるのでオススメです♪

手順

Gradleのインストール

まずはGradle本体をインストールしましょう。
例の如く、Homebrewでサクッとインストールします。

コマンド
brew install gradle

以下のログが出ればインストール完了です。

インストールログ
==> 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

確認

以下のコマンドが動くか確認してみましょう。

gradle -v
------------------------------------------------------------
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

正常に動いていますね。

参考

プロジェクトの作成

では、サンプル用のプロジェクトを作成しましょう。

プロジェクト用のディレクトリを作成したら、その中に入り以下のコマンドを実行してください。

コマンド
gradle init --type java-application

すると数秒で以下のようなログが出力されます。

実行ログ
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開発のプロジェクトのひな壇が生成されている事がわかります。

tree .
.
.
├── 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

なので以下の様になります。

実行コマンド
./gradlew build

これはbuildというタスクを呼び出して実行しています。
gradleには基本的なビルドや起動、ライブラリインストールなのどの汎用的に使われるものはデフォルトで用意されています
詳しくはコチラをみてください。

実行結果は以下の通りになると思います。

実行結果
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プログラムを動かしましょう。
以下のコマンドを実行してみてください。

コマンド
./gradlew run

以下の様にApp.javaの処理結果が出力されていれば成功です。

src/main/java/App.java
/*
 * 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());
    }
}

起動ログ
> Task :run
Hello world.

BUILD SUCCESSFUL in 1s
2 actionable tasks: 1 executed, 1 up-to-date

正常にお約束のHello world.が出力されましたね♪

ユニットテスト

生成されたプロジェクトはJUnitを用いたユニットテストを考慮したプロジェクト構造になっており、上記の通りbuildタスクを実行すれば自動で実行もされているのでとても助かりますね♪

試しにユニットテストが失敗する形にして実行してみましょう。

現在はメソッドのNotNullチェックをしているので、一時的にnullを返す様にすればよさそうですね。

src/test/java/AppTest.java
/*
 * 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になりそう
    }
}

src/main/java/App.java
/*
 * 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());
    }
}

確認

では、もう一度実行してみましょう。

./gradlew build
> 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を入れてみます。

build.gradle
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を使う様に修正してみます。

src/main/java/App.java
/*
 * 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;
      }
    }
}

確認

では、以下のコマンドを実行してみてください。

コマンド
./gradlew run

ライブラリのダウンロードが走るのでちょっと実行時間がかかりますが、以下の様にJson文字列が出力されていれば成功です。

実行ログ
> Task :run
{"name":"taro","age":25}

BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 executed

とても簡単ですね♪

終わりに

以上の様にコマンドベースで簡単にGradleプロジェクトの環境を整えることが出来ました。

Gradleはまだまだ数年は現役で走り続けるビルドツールだと思いますので、是非この機会に覚えてみてください♪