このガイドでは、Gradle を使用して簡単な Java プロジェクトを構築する方法を説明します。

構築する

簡単なアプリを作成し、Gradle を使用して構築します。

必要なもの

このガイドを完了する方法

ほとんどの Spring 入門ガイドと同様に、最初から始めて各ステップを完了するか、すでに慣れている場合は基本的なセットアップステップをバイパスできます。いずれにしても、最終的に動作するコードになります。

最初から始めるには、プロジェクトをセットアップするに進みます。

基本スキップするには、次の手順を実行します。

完了したときは、gs-gradle/complete のコードに対して結果を確認できます。

プロジェクトをセットアップする

最初に、Gradle がビルドする Java プロジェクトをセットアップします。Gradle に焦点を当て続けるために、現時点ではプロジェクトをできるだけシンプルにしてください。

ディレクトリ構造を作成する

選択したプロジェクトディレクトリで、次のサブディレクトリ構造を作成します。たとえば、*nix システム上の mkdir -p src/main/java/hello の場合:

└── src
    └── main
        └── java
            └── hello

src/main/java/hello ディレクトリ内で、必要な Java クラスを作成できます。簡単にするため、およびこのガイドの残りの部分と一貫性を保つために、Spring では、HelloWorld.java と Greeter.java の 2 つのクラスを作成することをお勧めします。

src/main/java/hello/HelloWorld.java

package hello;

public class HelloWorld {
  public static void main(String[] args) {
  Greeter greeter = new Greeter();
  System.out.println(greeter.sayHello());
  }
}

src/main/java/hello/Greeter.java

package hello;

public class Greeter {
  public String sayHello() {
  return "Hello world!";
  }
}

Gradle をインストールする

Gradle でビルドできるプロジェクトができたため、Gradle をインストールできます。

インストーラーを使用することを強くお勧めします。

最後の手段として、これらのツールのどちらもニーズに合わない場合は、https://www.gradle.org/downloads (英語) からバイナリをダウンロードできます。必要なのはバイナリのみなので、gradle- バージョン -bin.zip へのリンクを探してください。(gradle- バージョン -all.zip を選択して、ソースとドキュメント、バイナリを取得することもできます。)

ファイルをコンピューターに解凍し、bin フォルダーをパスに追加します。

Gradle インストールをテストするには、コマンドラインから Gradle を実行します。

gradle

すべてうまくいけば、ウェルカムメッセージが表示されます:

:help

Welcome to Gradle 6.0.1.

To run a build, run gradle <task> ...

To see a list of available tasks, run gradle tasks

To see a list of command-line options, run gradle --help

To see more detail about a task, run gradle help --task <task>

For troubleshooting, visit https://help.gradle.org

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.0.1/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 455ms
1 actionable task: 1 executed

これで、Gradle がインストールされました。

Gradle でできることを調べる

Gradle がインストールされたため、何ができるかを参照してください。プロジェクトの build.gradle ファイルを作成する前に、使用可能なタスクを確認することができます。

gradle tasks

使用可能なタスクのリストが表示されます。build.gradle ファイルがまだないフォルダーで Gradle を実行すると仮定すると、次のような非常に基本的なタスクが表示されます。

:tasks

------------------------------------------------------------
Tasks runnable from root project
------------------------------------------------------------

Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.

Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'gs-gradle'.
components - Displays the components produced by root project 'gs-gradle'. [incubating]
dependencies - Displays all dependencies declared in root project 'gs-gradle'.
dependencyInsight - Displays the insight into a specific dependency in root project 'gs-gradle'.
dependentComponents - Displays the dependent components of components in root project 'gs-gradle'. [incubating]
help - Displays a help message.
model - Displays the configuration model of root project 'gs-gradle'. [incubating]
outgoingVariants - Displays the outgoing variants of root project 'gs-gradle'.
projects - Displays the sub-projects of root project 'gs-gradle'.
properties - Displays the properties of root project 'gs-gradle'.
tasks - Displays the tasks runnable from root project 'gs-gradle'.

To see all tasks and more detail, run gradle tasks --all

To see more detail about a task, run gradle help --task <task>

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.0.1/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 477ms
1 actionable task: 1 executed

これらのタスクは使用可能ですが、プロジェクトビルド構成なしではあまり価値がありません。build.gradle ファイルを具体化すると、いくつかのタスクがより便利になります。プラグインを build.gradle に追加すると、タスクのリストが大きくなるため、ときどきタスクを再度実行して、使用可能なタスクを確認することができます。

プラグインの追加については、次に基本的な Java ビルド機能を有効にするプラグインを追加します。

Java コードをビルドする

簡単に始めて、このガイドの冒頭で作成した <project folder> に非常に基本的な build.gradle ファイルを作成します。たった 1 行で入力してください:

apply plugin: 'java'

ビルド構成のこの単一行は、かなりの量の電力をもたらします。gradle タスクを再度実行すると、プロジェクトのビルド、JavaDoc の作成、テストの実行など、新しいタスクがリストに追加されます。

gradle ビルドタスクを頻繁に使用します。このタスクは、コードをコンパイルしてテストし、JAR ファイルにアセンブルします。次のように実行できます。

gradle build

数秒後、「BUILD SUCCESSFUL」はビルドが完了したことを示します。

ビルド作業の結果を確認するには、ビルドフォルダーを参照してください。そこには、次の 3 つの注目すべきフォルダーを含むいくつかのディレクトリがあります。

  • classes。プロジェクトのコンパイルされた .class ファイル。

  • reports。ビルドによって生成されたレポート(テストレポートなど)。

  • libs。アセンブリされたプロジェクトライブラリ(通常は JAR および / または WAR ファイル)。

クラスフォルダーには、Java コードのコンパイルから生成される .class ファイルがあります。具体的には、HelloWorld.class および Greeter.class を見つける必要があります。

この時点では、プロジェクトにはライブラリの依存関係がないため、dependency_cache フォルダーには何もありません。

レポートフォルダーには、プロジェクトで実行中の単体テストのレポートが含まれている必要があります。プロジェクトにはまだ単体テストがないため、このレポートは面白くないでしょう。

libs フォルダーには、プロジェクトのフォルダーにちなんだ名前の JAR ファイルが含まれている必要があります。さらに下に、JAR の名前とそのバージョンを指定する方法が表示されます。

依存関係を宣言する

単純な Hello World サンプルは完全に自己完結型であり、追加のライブラリに依存しません。ただし、ほとんどのアプリケーションは、一般的な機能や複雑な機能を処理するために外部ライブラリに依存しています。

例: 「Hello World!」と言うだけでなく、アプリケーションに現在の日付と時刻を出力させたいとします。ネイティブ Java ライブラリの日付と時刻の機能を使用することもできますが、Joda Time ライブラリを使用することでより興味深いものにすることができます。

まず、HelloWorld.java を次のように変更します。

package hello;

import org.joda.time.LocalTime;

public class HelloWorld {
  public static void main(String[] args) {
    LocalTime currentTime = new LocalTime();
    System.out.println("The current local time is: " + currentTime);

    Greeter greeter = new Greeter();
    System.out.println(greeter.sayHello());
  }
}

ここでは、HelloWorld は Joda Time の LocalTime クラスを使用して現在の時刻を取得および出力します。

今すぐ gradle build を実行してプロジェクトをビルドした場合、ビルドのコンパイル依存関係として Joda Time を宣言していないため、ビルドは失敗します。

まず第一に、サードパーティのライブラリのソースを追加する必要があります。

repositories { 
    mavenCentral() 
}

repositories ブロックは、ビルドが Maven セントラルリポジトリから依存関係を解決する必要があることを示しています。Gradle は、Maven セントラルをライブラリ依存関係のソースとして使用するオプションを含む、Maven ビルドツールによって確立された多くの規則と機能に大きく依存しています。

サードパーティのライブラリの準備ができたため、いくつか宣言しましょう。

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    implementation "joda-time:joda-time:2.2"
    testImplementation "junit:junit:4.12"
}

dependencies ブロックでは、Joda Time の単一の依存関係を宣言します。具体的には、joda-time グループの joda-time ライブラリのバージョン 2.2(右から左に読む)を要求しています。

この依存関係について注意すべきもう 1 つの点は、それが compile 依存関係であることです。これは、コンパイル時に使用可能でなければならないことを示します(WAR の /WEB-INF/libs フォルダーに含まれる WAR ファイルを作成している場合)。他の注目すべきタイプの依存関係は次のとおりです。

  • implementation。プロジェクトコードのコンパイルに必要な依存関係。ただし、実行時にコードを実行するコンテナー(Java Servlet API など)によって提供されます。

  • testImplementation。テストのコンパイルと実行に使用される依存関係。ただし、プロジェクトのランタイムコードの構築または実行には必要ありません。

最後に、JAR アーティファクトの名前を指定しましょう。

jar {
    archiveBaseName = 'gs-gradle'
    archiveVersion =  '0.1.0'
}

jar ブロックは、JAR ファイルの命名方法を指定します。この場合、gs-gradle-0.1.0.jar をレンダリングします。

gradle build を実行すると、Gradle は Maven セントラルリポジトリからの Joda Time 依存関係を解決し、ビルドは成功します。

Gradle ラッパーを使用してプロジェクトをビルドする

Gradle ラッパーは、Gradle ビルドを開始する推奨する方法です。Windows 用のバッチスクリプトと OS X および Linux 用のシェルスクリプトで構成されています。これらのスクリプトを使用すると、Gradle をシステムにインストールすることなく、Gradle ビルドを実行できます。これはビルドファイルに追加されたものでしたが、Gradle に折りたたまれているため、もはや必要ありません。代わりに、単に次のコマンドを使用します。

$ gradle wrapper --gradle-version 6.0.1

このタスクが完了すると、いくつかの新しいファイルが表示されます。2 つのスクリプトはフォルダーのルートにあり、ラッパー jar とプロパティファイルは新しい gradle/wrapper フォルダーに追加されています。

└── <project folder>
    └── gradlew
    └── gradlew.bat
    └── gradle
        └── wrapper
            └── gradle-wrapper.jar
            └── gradle-wrapper.properties

Gradle ラッパーがプロジェクトのビルドに使用できるようになりました。それをバージョン管理システムに追加すれば、プロジェクトを複製する誰もが同じようにビルドできます。Gradle のインストール済みバージョンとまったく同じ方法で使用できます。前と同じように、ラッパースクリプトを実行してビルドタスクを実行します。

./gradlew build

Gradle の指定されたバージョンのラッパーを初めて実行すると、そのバージョンの Gradle バイナリがダウンロードされてキャッシュされます。Gradle ラッパーファイルは、特定のバージョンの Gradle をインストールして構成しなくても誰でもプロジェクトをビルドできるように、ソース管理にコミットするように設計されています。

この段階で、コードを構築できました。ここで結果を見ることができます:

build
├── classes
│   └── main
│       └── hello
│           ├── Greeter.class
│           └── HelloWorld.class
├── dependency-cache
├── libs
│   └── gs-gradle-0.1.0.jar
└── tmp
    └── jar
        └── MANIFEST.MF

Greeter および HelloWorld の予想される 2 つのクラスファイルと JAR ファイルが含まれています。簡単に見てみましょう:

$ jar tvf build/libs/gs-gradle-0.1.0.jar
  0 Fri May 30 16:02:32 CDT 2014 META-INF/
 25 Fri May 30 16:02:32 CDT 2014 META-INF/MANIFEST.MF
  0 Fri May 30 16:02:32 CDT 2014 hello/
369 Fri May 30 16:02:32 CDT 2014 hello/Greeter.class
988 Fri May 30 16:02:32 CDT 2014 hello/HelloWorld.class

クラスファイルはバンドルされています。重要なのは、依存関係として joda-time を宣言していても、ここにはライブラリが含まれていないことです。また、JAR ファイルも実行できません。

このコードを実行可能にするために、gradle の application プラグインを使用できます。これを build.gradle ファイルに追加します。

apply plugin: 'application'

mainClassName = 'hello.HelloWorld'

その後、アプリを実行できます!

$ ./gradlew run
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:run
The current local time is: 16:16:20.544
Hello world!

BUILD SUCCESSFUL

Total time: 3.798 secs

依存関係をまとめるには、さらに検討が必要です。例: サードパーティの依存関係のパッキングに一般的に関連付けられている形式である WAR ファイルを作成する場合は、gradle の WAR プラグイン (英語) を使用できます。Spring Boot を使用していて、実行可能な JAR ファイルが必要な場合は、spring-boot-gradle-plugin が非常に便利です。この段階では、gradle はシステムについて十分な知識を持っていないため、選択を行うことができません。しかし今のところ、gradle の使用を開始するにはこれで十分です。

このガイドの内容をまとめるために、完成した build.gradle ファイルを以下に示します。

build.gradle

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'application'

mainClassName = 'hello.HelloWorld'

// tag::repositories[]
repositories { 
    mavenCentral() 
}
// end::repositories[]

// tag::jar[]
jar {
    archiveBaseName = 'gs-gradle'
    archiveVersion =  '0.1.0'
}
// end::jar[]

// tag::dependencies[]
sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    implementation "joda-time:joda-time:2.2"
    testImplementation "junit:junit:4.12"
}
// end::dependencies[]

// tag::wrapper[]
// end::wrapper[]
ここには多くの開始 / 終了コメントが埋め込まれています。これにより、上記の詳細な説明のために、ビルドファイルの一部をこのガイドに抽出できます。本番ビルドファイルでは必要ありません。

要約

おめでとう! これで、Java プロジェクトをビルドするためのシンプルで効果的な Gradle ビルドファイルが作成されました。

関連事項

次のガイドも役立ちます。

新しいガイドを作成したり、既存のガイドに貢献したいですか? 投稿ガイドラインを参照してください: GitHub (英語)

すべてのガイドは、コード用の ASLv2 ライセンス、およびドキュメント用の Attribution、NoDerivatives クリエイティブコモンズライセンス (英語) でリリースされています。