Javaプラグインとは
GradleでJavaプロジェクトをビルドするには、Javaプラグインが必要となる。
プラグインを適用するには、build.gradleに以下を記述する。
apply plugin: 'java'
Javaプラグインは「タスク」「規約」「プロパティ」「ソースセット」の4つの要素が
パッケージングされたコンポーネントである。
それぞれの要素について学習することで、Javaプラグインを使ったビルドの動きを理解する。
ソースセット
ソースセットとは、同時にコンパイルを行うべき対象をグループ化した概念である。
Javaプラグインでは、デフォルトで
- main:プロダクションコードおよび本番用のリソースをまとめたソースセット
- test:テストコードおよびテスト用のリソースをまとめたソースセット
上記2つのソースセットを提供している。
ソースコードは次のような特徴を持つ。
- ビルドスクリプトで自由に追加できる
- 一意な名前を持つ
- コンパイル対象となる「Javaソース」と「リソース」のセットを指定できる
- コンパイル結果の生成物(クラスファイルなど)を出力するパスを指定できる
- コンパイル時、および実行時のクラスパスを指定できる
- タスク及びプロパティをソースセットごとに設定できる
タスク
Gradleでは、プラグインを追加すると、同時にビルドに必要な作業がタスクとして追加される。
Javaプラグインも、以下のタスクが追加される。
| タスク | 説明 |
|---|---|
| compileJava | プロダクションコードのコンパイルを行う。対象はソースセットmainのjava.srcDirsプロパティで指定したディレクトリに格納された、拡張子が.javaのファイル。 |
| processResources | プロダクションコードのリソースをクラスパスにコピーする。対象はソースセットmainのresources.srcDirsプロパティで指定したディレクトリに格納された、拡張子が.java以外のファイル。 |
| classes | compileJavaとprocessResourcesタスクを実行する。 |
| compileTestJava | ソースセットtestに対してcompileJavaタスクと同じ動きをする。 |
| processTestResources | ソースセットtestに対してprocessResourcesタスクと同じ動きをする。 |
| testClasses | compileTestJavaとprocessTestResourcesタスクを実行する。 |
| jar | JARファイルを生成する。デフォルトのアーカイブ対象はmainソースセットのoutputプロパティ。(compileJavaとprocessResourcesタスクの出力) |
| javadoc | mainソースセットのJavadocを出力する。 |
| test | testソースセットに含まれるテストを実行する。デフォルトでのテスト対象はtestClassesタスクの出力から自動で抽出される。 |
| uploadArchives | アーティファクト(ビルドの成果物)のアーカイブをリポジトリなどにアップロードする。 |
| clean | ビルド出力を削除する。デフォルトではbuildディレクトリが削除される。 |
| clean <TaskName> | 指定したタスク<TaskName>の出力のみを削除する。 |
| assemble | テストを実行せず、プロジェクト内容に応じて適切なアーティファクトを生成する。Javaプラグインのデフォルトではjarタスクと等価である。 |
| check | プロジェクトの検証を行う。Javaプラグインのデフォルトではtestタスクと等価である。 |
| build | プロジェクトのビルドを行う。checkとassembleタスクを実行する。 |
| buildNeeded | ビルド対象のプロジェクトだけでなく、依存関係を設定したプロジェクトも含め、ビルドを行う。 |
| buildDependents | ビルド対象プロジェクトに依存しているプロジェクトも含め、ビルドを行う。 |
ソースセットの追加とタスクの自動追加
Javaプラグインでは、ソースセットを追加すると
ソースセットごとに次のタスクが自動的に追加される。
- compile<SourceSet>Java
- process<SourceSet>Resources
- <SourceSet>Classes
規約
規約とは、「JavaプロジェクトではJavaファイルをsrc/main/javaディレクトリ配下に配置する」
といったような約束事である。Javaプラグインには以下の規約がある。
- プロダクションコードのソースファイル
→ src/main/javaディレクトリ配下に配置する - プロダクションコードのリソース
→ src/main/resourcesディレクトリ配下に配置する - テストコードのソースファイル
→ src/test/javaディレクトリ配下に配置する - テストコードのリソース
→ src/test/resourcesディレクトリ配下に配置する
プロパティ
プロパティはタスクの入出力対象や、規約のディレクトリなどを制御するために設定する。
Javaプラグインのプロパティ(共通)
Projectオブジェクトが提供するプロパティ。
| プロパティ | 説明 | デフォルト |
|---|---|---|
| testResultDir | テスト結果のXMLファイル出力先 | build/test-results |
| testReportDir | テストレポート(HTML)出力先 | build/reports/tests |
| libsDir | ライブラリ(JARファイル)出力先 | build/libs |
| distDir | ディストリビューション(JARファイル以外のアーカイブ)出力先 | build/distributions |
| docsDir | Javadocなどのドキュメント出力先 | build/docs |
| sourceSets | プロジェクトのソースセット | main、testソースセットのコンテナ |
| sourceCompatibility | Javaソースコンパイル時のJavaバージョン | ビルドスクリプト実行環境のJVMのバージョン |
| targetCompatibility | コンパイル時のクラス生成のターゲットに指定するJavaバージョン | sourceCompatibilityの値 |
| archivesBaseName | JARなどのアーカイブファイルのベースネーム | project.nameプロパティの値(デフォルトはプロジェクトのルートディレクトリ名) |
| manifest | 全てのJARファイルに含めるマニュフェスト | なし |
println project.docsDir
println docsDir
Javaプラグインのプロパティ(ソースセットごとに提供)
ProjectオブジェクトのsourceSetsプロパティが提供するプロパティ。
| プロパティ | 説明 | デフォルト |
|---|---|---|
| name | ソースセット名。プロジェクト内で一意の値であること | なし |
| output | ソースセットの出力 | output.classDir、output.resourceDirプロパティの値 |
| output.classDir | ソースセットのクラスファイル出力先 | build/classes/<sourceSet> |
| output.resourcesDir | ソースセットのリソース出力先 | build/resources/<sourceSet> |
| compileClasspath | ソースセットのコンパイル時クラスパス | コンフィグレーションcompile<SourceSet>の設定値 |
| runtimeClasspath | ソースセットの実行時クラスパス | outputプロパティ、コンフィグレーションruntime<sourceSet>の設定値 |
| java | ソースセットのJavaソース全て | src/<sourceSet>/java配下の拡張子が.javaのファイル |
| java.srcDirs | ソースセットのJavaソースを含むディレクトリ | src/<sourceSet>/java |
| resources | ソースセットのリソース全て | src/<sourceSet>/resources配下の拡張子が.javaでないファイル |
| resources.srcDirs | ソースセットのリソースを含むディレクトリ | src/<sourceSet>/resources |
| allJava | ソースセットの全てのJavaソース | javaプロパティの設定値(プラグイン適用で変更の可能性あり) |
| allSource | ソースセットの全てのJavaソースとリソース | java、resourcesプロパティの設定値(プラグイン適用で変更の可能性あり) |
println project.sourceSets.test.compileClasspath
println sourceSets.test.compileClasspath
println sourceSets['test'].compileClasspath
参照
この記事は以下の書籍を参考に執筆しています。