第7章 Javaクイックスタート

7.1. JavaプラグインThe Java plugin

As we have seen, Gradle is a general-purpose build tool. It can build pretty much anything you care to implement in your build script. Out-of-the-box, however, it doesn't build anything unless you add code to your build script to do so.

ここまで見てきたように、Gradleは汎用のビルドツールです。ビルドスクリプトで実装したいと思うようなものはほぼ何でもビルドできます。しかし、初期状態では、ビルドスクリプトに何かを行うためのコードを追加しない限り、何もビルドはしません。

Most Java projects are pretty similar as far as the basics go: you need to compile your Java source files, run some unit tests, and create a JAR file containing your classes. It would be nice if you didn't have to code all this up for every project. Luckily, you don't have to. Gradle solves this problem through the use of plugins. A plugin is an extension to Gradle which configures your project in some way, typically by adding some pre-configured tasks which together do something useful. Gradle ships with a number of plugins, and you can easily write your own and share them with others. One such plugin is the Java plugin. This plugin adds some tasks to your project which will compile and unit test your Java source code, and bundle it into a JAR file.

多くのJavaプロジェクトは、基本的な部分では非常に似通っています。つまり、Javaソースファイルをコンパイルし、ユニットテストを実行し、クラスを含んだJARファイルを生成する必要があります。すべてのプロジェクトで、これらをいちいちコーディングするのは面倒です。幸運にもその必要はありません。Gradleはプラグインによってこの問題を解決します。プラグインは、何らかの方法(よくあるのは設定済みの一連の有用なタスクの追加)によってプロジェクトを構成する、Gradleの拡張です。Gradleには多くのプラグインが同梱されており、さらに自作のプラグインを書き、共有することも簡単にできます。こういったプラグインの一つがJavaプラグインです。このプラグインは、Javaソースコードのコンパイルやユニットテスト、JARファイルの作成などを行うタスクをプロジェクトに追加します。

The Java plugin is convention based. This means that the plugin defines default values for many aspects of the project, such as where the Java source files are located. If you follow the convention in your project, you generally don't need to do much in your build script to get a useful build. Gradle allows you to customize your project if you don't want to or cannot follow the convention in some way. In fact, because support for Java projects is implemented as a plugin, you don't have to use the plugin at all to build a Java project, if you don't want to.

Javaプラグインは規約ベースです。すなわち、このプラグインはプロジェクトのさまざまな点、例えばJavaソースファイルを置く場所などについてデフォルト値を定義しています。プロジェクトがこの規約に従う限り、大抵はビルドスクリプトであまり多くのことを行わなくても有用なビルドを行うことができます。何らかの事情で規約に従いたくない、または従えない場合、Gradleはプロジェクトのカスタマイズも許しています。実際、Javaプロジェクトのサポートがプラグインとして実現されているので、希望しない場合には、Javaプロジェクトのビルドであってもこのプラグインをまったく使わないことも可能です。

We have in-depth coverage with many examples about the Java plugin, dependency management and multi-project builds in later chapters. In this chapter we want to give you an initial idea of how to use the Java plugin to build a Java project.

Javaプラグイン、依存関係の管理、マルチプロジェクトのビルドについては、後の章で多くの実例付きで詳しく扱います。この章では、JavaプロジェクトをビルドするためのJavaプラグインの使い方について、まず基本的な知識を提供したいと思います。

7.2. 基本的なJavaプロジェクトA basic Java project

Let's look at a simple example. To use the Java plugin, add the following to your build file:

シンプルな例から見ていきましょう。Javaプラグインを使うためには、ビルドファイルに以下を加えます:

例7.1 Javaプラグインの使用

build.gradle

apply plugin: 'java'

ノート: 本例のソースコードは、Gradleのバイナリ配布物またはソース配布物に含まれています。以下の場所をご参照ください。samples/java/quickstart


This is all you need to define a Java project. This will apply the Java plugin to your project, which adds a number of tasks to your project.

Javaプロジェクトの定義に必要なのはこれだけです。これでプロジェクトにJavaプラグインが適用され、多くのタスクが追加されます。

どんなタスクが利用可能?What tasks are available?

You can use gradle tasks to list the tasks of a project. This will let you see the tasks that the Java plugin has added to your project.

gradle tasksを使えば、プロジェクトのタスクを一覧することができます。これによって、Javaプラグインがプロジェクトに追加したタスクを見ることができるでしょう。

Gradle expects to find your production source code under src/main/java and your test source code under src/test/java. In addition, any files under src/main/resources will be included in the JAR file as resources, and any files under src/test/resources will be included in the classpath used to run the tests. All output files are created under the build directory, with the JAR file ending up in the build/libs directory.

Gradleは、製品のソースコードがsrc/main/javaに、テストのソースコードがsrc/test/javaにあることを想定しています。さらに、src/main/resourcesの下にあるファイルはすべてリソースとしてJARに入れられ、またsrc/test/resourcesにあるファイルはテスト実行時に使われるクラスパスに入れられます。すべての出力ファイルはbuildディレクトリの下に作られ、最終的にbuild/libsディレクトリにJARファイルが作られます。

7.2.1. プロジェクトのビルドBuilding the project

The Java plugin adds quite a few tasks to your project. However, there are only a handful of tasks that you will need to use to build the project. The most commonly used task is the build task, which does a full build of the project. When you run gradle build, Gradle will compile and test your code, and create a JAR file containing your main classes and resources:

Javaプラグインはかなり多くのタスクをプロジェクトに追加します。しかし、プロジェクトをビルドするのに必要なタスクはほんの一握りです。最もよく使われるのはプロジェクトのフルビルドを行うbuildタスクです。gradle buildを実行すると、Gradleはコードをコンパイルしてテストし、メインクラスやリソースを含んだJARファイルを生成します:

例7.2 Javaプロジェクトのビルド

gradle build の出力

> gradle build
:compileJava
:processResources
:classes
:jar
:assemble
:compileTestJava
:processTestResources
:testClasses
:test
:check
:build

BUILD SUCCESSFUL

Total time: 1 secs

Some other useful tasks are:

他にも便利なタスクがあります:

clean

Deletes the build directory, removing all built files.

buildディレクトリを削除し、ビルドしたすべてのファイルを削除します。

assemble

Compiles and jars your code, but does not run the unit tests. Other plugins add more artifacts to this task. For example, if you use the War plugin, this task will also build the WAR file for your project.

コードをコンパイルしJARを生成しますが、ユニットテストは実行しません。他のプラグインはこのタスクにより多くのアーティファクトを追加します。例えばWarプラグインを使う場合、このタスクはプロジェクトのWARファイルも生成します。

check

Compiles and tests your code. Other plugins add more checks to this task. For example, if you use the checkstyle plugin, this task will also run Checkstyle against your source code.

コードをコンパイルし、テストします。他のプラグインはこのタスクにより多くの検査項目を追加します。例えばCode-qualityプラグインを使う場合、このタスクはソースコードに対してCheckstyleも実行します。

7.2.2. External dependencies

Usually, a Java project will have some dependencies on external JAR files. To reference these JAR files in the project, you need to tell Gradle where to find them. In Gradle, artifacts such as JAR files, are located in a repository. A repository can be used for fetching the dependencies of a project, or for publishing the artifacts of a project, or both. For this example, we will use the public Maven repository:

Javaプロジェクトは外部のJARファイルに依存することが普通です。プロジェクトで使うこういったJARファイルを参照するため、Gradleにそれらの場所を伝える必要があります。Gradleでは、JARファイルのようなアーティファクトはリポジトリに置かれます。リポジトリは、プロジェクトが依存するものを取得したり、プロジェクトのアーティファクトを公開したり、あるいはその両方のために利用することができます。この例では、公開Mavenリポジトリを使います:

例7.3 Mavenリポジトリの追加

build.gradle

repositories {
    mavenCentral()
}

Let's add some dependencies. Here, we will declare that our production classes have a compile-time dependency on commons collections, and that our test classes have a compile-time dependency on junit:

依存関係をいくつか追加してみましょう。製品クラスはコンパイル時にcommonsコレクションに依存し、テストクラスはコンパイル時にjunitに依存することを宣言します:

例7.4 依存関係の追加

build.gradle

dependencies {
    compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
    testCompile group: 'junit', name: 'junit', version: '4.+'
}

You can find out more in 8章依存関係管理の基本 .

詳しい説明は51章依存関係の管理 をご覧ください。

7.2.3. プロジェクトのカスタマイズCustomizing the project

The Java plugin adds a number of properties to your project. These properties have default values which are usually sufficient to get started. It's easy to change these values if they don't suit. Let's look at this for our sample. Here we will specify the version number for our Java project, along with the Java version our source is written in. We also add some attributes to the JAR manifest.

Javaプラグインは多くのプロパティをプロジェクトに追加します。こういったプロパティには普通、十分適切なデフォルト値が設定されています。不適切な場合、これらの値を変更するのは簡単です。では、実例を見てみましょう。ここでは、ソースの書かれたJavaバージョンとともに、Javaプロジェクトのバージョン番号を指定しています。また、JAR manifestにいくつか属性を追加しています。

例7.5 MANIFEST.MFのカスタマイズ

build.gradle

sourceCompatibility = 1.5
version = '1.0'
jar {
    manifest {
        attributes 'Implementation-Title': 'Gradle Quickstart',
                   'Implementation-Version': version
    }
}

どんなプロパティが利用可能?What properties are available?

You can use gradle properties to list the properties of a project. This will allow you to see the properties added by the Java plugin, and their default values.

gradle propertiesを使えば、プロジェクトのプロパティを一覧することができます。これによって、Javaプラグインが追加したプロパティとそのデフォルト値を見ることができるでしょう。

The tasks which the Java plugin adds are regular tasks, exactly the same as if they were declared in the build file. This means you can use any of the mechanisms shown in earlier chapters to customize these tasks. For example, you can set the properties of a task, add behaviour to a task, change the dependencies of a task, or replace a task entirely. In our sample, we will configure the test task, which is of type Test, to add a system property when the tests are executed:

Javaプラグインが追加するタスクはごく普通のタスクで、ビルドファイルで宣言されるものとまったく同等のものです。つまり、これらのタスクは、ここまでの章で説明したあらゆるメカニズムを使ってカスタマイズすることが可能だということです。例えば、タスクのプロパティを設定したり、タスクに振る舞いを追加したり、タスクの依存関係を変更したり、あるはタスク全体を完全に置き換えることすら可能です。以下の例では、Test型であるtestタスクを設定して、テスト実行時のシステムプロパティを追加しています:

例7.6 テスト用システムプロパティの追加

build.gradle

test {
    systemProperties 'property': 'value'
}

7.2.4. JARファイルの公開Publishing the JAR file

Usually the JAR file needs to be published somewhere. To do this, you need to tell Gradle where to publish the JAR file. In Gradle, artifacts such as JAR files are published to repositories. In our sample, we will publish to a local directory. You can also publish to a remote location, or multiple locations.

通常は、JARファイルをどこかに公開する必要があるでしょう。このため、GradleにJARファイルの公開先を教える必要があります。Gradleでは、JARファイルのようなアーティファクトはリポジトリに置かれます。以下の例ではローカルディレクトリに公開します。リモートな場所や、複数の場所に公開することも可能です。

例7.7 JARファイルの公開

build.gradle

uploadArchives {
    repositories {
       flatDir {
           dirs 'repos'
       }
    }
}

To publish the JAR file, run gradle uploadArchives.

JARファイルを公開するには、gradle uploadArchivesを実行してください。

7.2.5. Eclipseプロジェクトの作成Creating an Eclipse project

To create the Eclipse-specific descriptor files, like .project, you need to add another plugin to your build file:

.projectのようなEclipse固有の設定ファイルを生成するには、別のプラグインをビルドファイルに追加する必要があります:

例7.8 Eclipseプラグイン

build.gradle

apply plugin: 'eclipse'

Now execute gradle eclipse command to generate Eclipse project files. More information about the eclipse task can be found in 38章Eclipse プラグイン.

これでgradle eclipseコマンドを実行すればEclipseのプロジェクトファイルが生成されます。Eclipseタスクの詳細は38章Eclipse プラグインをご覧ください。

7.2.6. まとめSummary

Here's the complete build file for our sample:

これまでの例の完全なビルドファイルを以下に示します:

例7.9 Javaの例 - 完全なビルドファイル

build.gradle

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

sourceCompatibility = 1.5
version = '1.0'
jar {
    manifest {
        attributes 'Implementation-Title': 'Gradle Quickstart',
                   'Implementation-Version': version
    }
}

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
    testCompile group: 'junit', name: 'junit', version: '4.+'
}

test {
    systemProperties 'property': 'value'
}

uploadArchives {
    repositories {
       flatDir {
           dirs 'repos'
       }
    }
}

7.3. マルチプロジェクトのJavaビルドMulti-project Java build

Now let's look at a typical multi-project build. Below is the layout for the project:

さて、ここで典型的なマルチプロジェクトのビルドを見てみましょう。プロジェクトのレイアウトは以下の通りです:

例7.10 マルチプロジェクトビルド - 階層レイアウト

Build layout

multiproject/
  api/
  services/webservice/
  shared/
  services/shared/

ノート: 本例のソースコードは、Gradleのバイナリ配布物またはソース配布物に含まれています。以下の場所をご参照ください。samples/java/multiproject


Here we have four projects. Project api produces a JAR file which is shipped to the client to provide them a Java client for your XML webservice. Project webservice is a webapp which returns XML. Project shared contains code used both by api and webservice. Project services/shared has code that depends on the shared project.

この例には三つのプロジェクトがあります。プロジェクトapiは、このwebサービス用のJavaクライアントを提供するために顧客に出荷されるJARファイルを生成します。プロジェクトwebserviceはXMLを返すwebアプリケーションです。プロジェクトsharedは、apiwebserviceの両方で使われる共通コードです。

7.3.1. マルチプロジェクトビルドの定義Defining a multi-project build

To define a multi-project build, you need to create a settings file. The settings file lives in the root directory of the source tree, and specifies which projects to include in the build. It must be called settings.gradle. For this example, we are using a simple hierarchical layout. Here is the corresponding settings file:

マルチプロジェクトのビルドを定義するためには、settingsファイルを作成する必要があります。settingsファイルはソースツリーのルートディレクトリに置かれ、このビルドにどのプロジェクトが含まれるかを指定します。名前はsettings.gradleでなければなりません。この例では、シンプルな階層レイアウトを使っています。対応するsettingsファイルは以下のようになります:

例7.11 マルチプロジェクトビルド - settings.gradleファイル

settings.gradle

include "shared", "api", "services:webservice", "services:shared"

You can find out more about the settings file in 57章マルチプロジェクトのビルド.

settingsファイルの詳細は57章マルチプロジェクトのビルドをご覧ください。

7.3.2. 共通設定Common configuration

For most multi-project builds, there is some configuration which is common to all projects. In our sample, we will define this common configuration in the root project, using a technique called configuration injection. Here, the root project is like a container and the subprojects method iterates over the elements of this container - the projects in this instance - and injects the specified configuration. This way we can easily define the manifest content for all archives, and some common dependencies:

大抵のマルチプロジェクトビルドでは、すべてのプロジェクトに共通な設定があります。この例では、設定のインジェクションと呼ばれる技法を使い、こういった共通設定をルートプロジェクトで定義します。ここでは、ルートプロジェクトはコンテナのようなもので、subprojectsメソッドはコンテナの全要素、すなわちこの実例の中の全プロジェクト、に対して反復しつつ指定された設定をインジェクトします。このようにして、全アーカイブのmanifestコンテンツや共通の依存関係を簡単に定義できます:

例7.12 マルチプロジェクトビルド - 共通設定

build.gradle

subprojects {
    apply plugin: 'java'
    apply plugin: 'eclipse-wtp'

    repositories {
       mavenCentral()
    }

    dependencies {
        testCompile 'junit:junit:4.11'
    }

    version = '1.0'

    jar {
        manifest.attributes provider: 'gradle'
    }
}

Notice that our sample applies the Java plugin to each subproject. This means the tasks and configuration properties we have seen in the previous section are available in each subproject. So, you can compile, test, and JAR all the projects by running gradle build from the root project directory.

この例で、各サブプロジェクトにJavaプラグインが適用されていることに注意してください。 これは、前の節で述べたタスクや設定プロパティが各サブプロジェクトでも利用可能であることを意味しています。 そんなわけで、ルートプロジェクトディレクトリからgradle buildを実行することによって、 すべてのプロジェクトをコンパイルし、テストし、JARを生成できるのです。

Also note that these plugins are only applied within the subprojects section, not at the root level, so the root build will not expect to find Java source files in the root project, only in the subprojects.

7.3.3. プロジェクト間の依存関係Dependencies between projects

You can add dependencies between projects in the same build, so that, for example, the JAR file of one project is used to compile another project. In the api build file we will add a dependency on the shared project. Due to this dependency, Gradle will ensure that project shared always gets built before project api.

同じビルド内のプロジェクト間の依存関係を追加することもできます。したがって例えば、一つのプロジェクトのJARファイルを別のプロジェクトのコンパイルのために利用することもできます。ここでは、apiのビルドファイルにsharedプロジェクトが作るJARへの依存関係を追加します。この依存関係のため、Gradleはsharedプロジェクトがapiプロジェクトより前にビルドされることを確実にします。

例7.13 マルチプロジェクトビルド - プロジェクト間の依存関係

api/build.gradle

dependencies {
    compile project(':shared')
}

See 「依存プロジェクトをビルドしないようにするDisabling the build of dependency projects for how to disable this functionality.

この機能を無効にする方法については「依存プロジェクトをビルドしないようにするDisabling the build of dependency projectsを参照してください。

7.3.4. 配布物の作成Creating a distribution

We also add a distribution, that gets shipped to the client:

顧客に出荷する配布物も追加しておきましょう:

例7.14 マルチプロジェクトビルド - 配布ファイル

api/build.gradle

task dist(type: Zip) {
    dependsOn spiJar
    from 'src/dist'
    into('libs') {
        from spiJar.archivePath
        from configurations.runtime
    }
}

artifacts {
   archives dist
}

7.4. 次のステップは?Where to next?

In this chapter, you have seen how to do some of the things you commonly need to build a Java based project. This chapter is not exhaustive, and there are many other things you can do with Java projects in Gradle. You can find out more about the Java plugin in 23章Javaプラグイン, and you can find more sample Java projects in the samples/java directory in the Gradle distribution.

この章では、Javaベースのプロジェクトをビルドするときに、一般的に必要になる作業のやり方を見てきました。この章は、Javaプロジェクトについて完全に網羅しているわけではありません。Gradleでできることはもっとたくさんあります。Javaプロジェクトについて更に掘り下げたい場合は、23章Javaプラグインで詳しく知ることができます。また、Gradleの配布物に含まれるsample/javaにはもっと多くのサンプルがあります。

Otherwise, continue on to 8章依存関係管理の基本 .

そうでない場合は、続けて8章依存関係管理の基本 に進んでください。