前面几篇学習した Gradle 構築タスクの基礎知識について、まずは前の数記事を読むことをお勧めします:
- Gradle シリーズ之初識 Gradle
- Gradle 之 Groovy 基礎
- Gradle シリーズ之構築スクリプト基礎
- Gradle シリーズ之 Gradle タスク
- Gradle シリーズ之 Gradle プラグイン
上篇文章 では Gradle プラグインに関する知識と、Gradle プラグインをカスタマイズする方法について学びました。本記事では主に Java Gradle プラグインに関する知識を学びます。なぜなら、Java Gradle プラグインに関する内容は Android Gradle プラグインの基礎でもあるからです。Gradle を使用してプロジェクトを構築することは、開発者がいくつかの繰り返し作業を行うのを助けることに他なりません。たとえば、サードパーティの依存関係の設定、ソースファイルのコンパイル、単体テスト、パッケージのリリースなどです。適切な Gradle プラグインを使用することで、プロジェクトの構築が容易になり、ある程度開発効率が向上します。以下は本日学ぶ主な内容です:
- Java Gradle プラグインの使用
- Java プラグインの規約に基づくプロジェクト構造
- サードパーティの依存関係の設定
- Java プロジェクトの構築方法
- SourceSet ソースセットの概念
- Java プラグインが追加できるタスク
- Java プラグインが追加できる属性
- マルチプロジェクト構築
- 構件の公開
Java Gradle プラグインの使用#
Gradle プラグインを使用するには、Project の apply () メソッドを使用します:
//javaはJava Gradleプラグインのplugin id
apply plugin:'java'
Java プラグインを使用すると、現在のプロジェクトにデフォルトの設定と規約が追加されます。たとえば、ソースコードの位置、単体テストコードの位置、リソースファイルの位置などです。一般的にはデフォルトの設定を使用すれば問題ありません。
Java プラグインの規約に基づくプロジェクト構造#
Java プラグインは、いくつかのデフォルトの設定と規約を設定します。以下は Java プロジェクトのデフォルトのプロジェクトディレクトリを見てみましょう。ディレクトリ構造は基本的に以下のようになります:
JavaGradle
└─src
├─main
│ ├─java
│ └─resources
└─test
├─java
└─resources
上記のディレクトリ構造では、src/main/java がデフォルトのソースコード格納ディレクトリであり、src/main/resources はリソースファイルや設定ファイルなどのディレクトリです。arc/test の下のディレクトリは、もちろんそれに対応する単体テスト関連ファイルの格納ディレクトリです。main と test は Java Gradle プラグインに内蔵された二つのソースコード集合であり、もちろんそれ以外にも自分で他のソースコード集合を定義することができます。定義方法は以下の通りです:
apply plugin : 'java'
sourceSets{
//新しいソースコード集合を指定
vip{
}
}
次に、src の下に対応する java と resources ディレクトリを作成します。具体的なディレクトリには、デフォルトと同様のファイル内容を格納します。デフォルトのディレクトリ構造は以下の通りです:
//ソースコードディレクトリ
src/vip/java
//リソースファイルディレクトリ
src/vip/resource
上記のディレクトリ構造はすべて Java Gradle プラグインのデフォルト実装です。もちろん、具体的なディレクトリの位置を変更することもできます。設定方法は以下の通りです:
sourceSets{
//デフォルトのディレクトリを変更します。以下はデフォルトの位置と同じですが、他のディレクトリを設定する場合は変更してください。
main{
java{
srcDir 'src/java'
}
resources{
srcDir 'src/resources'
}
}
}
サードパーティの依存関係の設定#
開発中には必ずサードパーティの jar パッケージを使用することになります。この場合、jar パッケージの依存関係を設定する必要があります。依存するリポジトリの種類やリポジトリの位置を指定します。具体的な依存関係は、Gradle が設定されたリポジトリから関連する依存関係を探しに行きます。リポジトリの設定と具体的な依存関係の設定は以下のようになります:
//リポジトリの位置を設定
repositories{
//リポジトリの種類(jcenter、ivy、maven 中央リポジトリ、maven ローカルリポジトリ、maven プライベートリポジトリなど)
mavenCentral()
mavenLocal()
maven {
uri "http"//xxxx
}
jcenter()
google()
//...
}
//具体的な依存関係を設定
dependencies{
//依存関係の三要素:group(グループ)、name(名称)、version(バージョン)
//それぞれ Maven の GAV(groupid、artifactid、version)に対応します。
//完全な書き方
compile group: 'com.squareup.okhttp3', name: 'okhttp', version:'3.0.1'
//簡略化
compile 'com.squareup.okhttp3:okhttp:3.0.1'
}
上記のコードでは、compile はコンパイル時の依存関係です。Gradle は他にもさまざまな依存関係を提供しています。具体的には以下の通りです:
compile:コンパイル時の依存関係
runtime:実行時の依存関係
testCompile:テスト時のコンパイル依存関係
testRuntime:テストケース実行時の依存関係
archives:構件を公開する際の依存関係(jar パッケージなど)
default:デフォルトの依存関係設定
Gradle 3.0 以降は、implementation や api が compile の代わりに使用されます。ここではこれらの依存関係の方法については詳しく説明しません。新しい API の学習は本記事の重点ではありません。Java Gradle プラグインは、異なるソースコード集合に異なる依存関係を指定することもサポートしています。具体的には以下のようになります:
//異なるソースコード集合に異なる依存関係を設定
dependencies{
//設定形式:sourceSetCompile、sourceSetRuntime
mainCompile 'com.squareup.okhttp3:okhttp:3.0.1'
vipCompile 'com.squareup.okhttp3:okhttp:2.0.1'
}
上記は特定の外部ライブラリの依存関係について説明しています。さらに、開発中にはモジュールの依存関係やファイルの依存関係にも遭遇します。実際には、モジュールの依存関係は特定のサブプロジェクトの依存関係であり、ファイルの依存関係は一般的に jar パッケージの依存関係です。
Gradle シリーズ之構築スクリプト基礎の記事では、特定のサブプロジェクトを構築するには、setting.gradle ファイルで include キーワードを使用してサブプロジェクトを引き入れる必要があることをすでに知っています。ここでも同様です。現在、setting.gradle ファイルで依存するプロジェクトを引き入れ、以下の方法で特定のサブプロジェクトに依存します。具体的には以下の通りです:
//サブプロジェクトに依存
dependencies{
//setting.gradleファイルで include ':childProject'
//サブプロジェクトに依存
compile project('childProject')
}
ファイルの依存関係は主に jar パッケージの依存関係です。一般的には、jar パッケージをプロジェクトの libs ディレクトリに置き、その jar パッケージを使用します。具体的には以下のようになります:
//jar パッケージに依存
dependencies{
//単一の jar を設定
compile file('libs/java1.jar')
//複数の jar を設定
compile files('libs/java1.jar','libs/java2.jar')
//バッチで jar を設定。jar の所在パスを設定すると、拡張子が jar のすべてのファイルがプロジェクトに依存します。
compile fileTree(dir:'libs',include:'*.jar')
}
Java プロジェクトの構築方法#
Gradle のすべての操作はタスクに基づいています。Java Gradle プラグインも、プロジェクトを構築するために一連のタスクを内蔵しています。build タスクを実行すると、Gradle は現在のプロジェクトの構築を開始します。gradlew build を使用して構築タスクを開始できます。Gradle はソースコードファイルをコンパイルし、リソースファイルを処理し、jar パッケージを生成し、テストコードをコンパイルし、単体テストを実行します。
Android 開発では clean タスクがあり、clean 操作を実行すると build フォルダやその他の構築プロジェクトで生成されたファイルが削除されます。コンパイルエラーが発生した場合は、clean を実行してから build を試みることができます。また、check タスクもあり、このタスクは単体テストの際に使用されます。javadoc タスクは Java 形式の doc API ドキュメントを生成するのに便利です。Java プロジェクトの構築目的は、Android プロジェクトの構築を学ぶ準備のためですので、Gradle を使用して Java プロジェクトを構築する方法はここまでとします。
SourceSet ソース集の概念#
この小節では SourceSet を理解します。これは前述のソースコード集合を指します。Java Gradle プラグインがソースコードとそのリソースを記述および管理するために使用する抽象概念です。Java ソースコードファイルとリソースファイルの集合であるため、ソースコード集合を通じてソースコードファイルの位置を設定したり、ソースコード集合の属性を設定したりできます。ソース集は異なるビジネスに応じてソースコードをグループ管理できます。たとえば、Java Gradle プラグインがデフォルトで提供する main と test のソースコードディレクトリは、ビジネスコード用と単体テスト用の二つのディレクトリであり、非常に便利です。
Java Gradle プラグインは Project の下に sourceSet 属性と sourceSet {} クロージャを提供して、ソース集にアクセスし、設定します。sourceSet は SourceSetContainer であり、ソース集の一般的な属性は以下の通りです:
//例えばmain、testなどはソース集の名前を示します
name(String)
//ソース集のコンパイル後の class ファイルディレクトリを示します
output.classDir(File)
//コンパイル後に生成されるリソースファイルのディレクトリを示します
output.resourcesDir(File)
//コンパイル後のソース集に必要な classpath を示します
compileClasspath(FileCollection)
//このソース集の Java ソースファイルを示します
java(SourceDirectorySet)
//このソース集の Java ソースファイルがあるディレクトリを示します
java.srcDirs(Set)
//ソース集のリソースファイルを示します
resources(SourceDirectorySet)
//このソース集のリソースファイルがあるディレクトリを示します
resources.srcDirs(Set)
以下は main というソース集の出力ディレクトリを設定する例です。参考にしてください:
//特定のソース集の属性を設定
sourceSets{
main{
//ソース集の名前は読み取り専用
println name
//他の属性の設定
//4.0からは非推奨になりました。dir に置き換えられました。
output.classesDir = file("a/b")
// output.dir("a/b")
output.resourcesDir = file("a/b")
//....
}
}
Java プラグインが追加できるタスク#
プロジェクトの構築は一連の Gradle プラグインが提供するタスクを通じて行われます。以下は Java プロジェクトで一般的に使用されるタスクの一覧です:
タスク名 | タイプ | 説明 |
---|---|---|
デフォルトのソース集共通タスク | ||
compileJava | JavaCompile | javac を使用して Java ソースファイルをコンパイルします |
processResources | Copy | リソースファイルを生成されたリソースファイルディレクトリにコピーします |
classes | Task | 生成されたクラスとリソースファイルディレクトリを組み立てます |
compileTestJava | JavaCompile | javac を使用してテスト Java ソースファイルをコンパイルします |
processTestResources | Copy | リソースファイルを生成されたリソースファイルディレクトリにコピーします |
testClasses | Task | 生成されたテストクラスと関連リソースファイルを組み立てます |
jar | Jar | jar ファイルを組み立てます |
javadoc | Javadoc | javadoc を使用して Java API ドキュメントを生成します |
uploadArchives | Upload | Jar を含む構築をアップロードします。archives {} クロージャを使用して設定します |
clean | Delete | 構築生成のディレクトリファイルをクリーンアップします |
cleanTaskName | Delete | 指定されたタスクによって生成されたファイルを削除します。たとえば、cleanJar は jar タスクによって生成されたファイルを削除します |
カスタムソース集タスク | (SourceSet は具体的なソース集名) | |
compileSourceSetJava | JavaCompile | 指定されたソース集のソースコードを javac でコンパイルします |
processSouceSetResources | Copy | 指定されたソース集のリソースファイルを生成ファイルのリソースディレクトリにコピーします |
sourcesSetClasses | Task | 指定されたソース集のクラスとリソースファイルディレクトリを組み立てます |
Java プラグインに追加できる属性#
Java Gradle プラグインの一般的な属性はすべて Project に追加されており、これらの属性は直接使用できます。具体的には以下の通りです:
属性名 | タイプ | 説明 |
---|---|---|
sourceSets | SourceSetContauner | Java プロジェクトのソース集。クロージャ内で関連設定を行うことができます |
sourceCompatibility | JavaVersion | Java ソースファイルをコンパイルする際に使用する Java バージョン |
targetCompatinility | JavaVersion | コンパイルして生成されたクラスの Java バージョン |
archivesBaseName | String | jar または zip ファイルにパッケージ化する際の名前 |
manifest | Manifest | manifest マニフェストファイルにアクセスし、設定するために使用します |
libsDir | File | 生成されたライブラリのディレクトリを格納します |
distsDir | File | 生成された公開ファイルのディレクトリを格納します |
マルチプロジェクト構築#
Gradle を使用して複数のプロジェクトを構築する場合、一般的には 1 つの主プロジェクトが他のサブモジュールプロジェクトに依存します。これらのサブプロジェクトを構築するかどうかは、Setting.gradle ファイルで設定されます。これらのサブプロジェクトを使用するには、主プロジェクト内でプロジェクト依存関係を設定する必要があります。前述の依存関係の三つの方法:ライブラリ依存、プロジェクト依存、ファイル依存を使用します。ここで使用されるのはプロジェクト依存です。マルチプロジェクト設定では、subprojects と allprojects がよく使用されます。具体的には以下の通りです:
//サブプロジェクトの統一設定
subprojects{
//すべてのサブプロジェクトが Java Gradle プラグインを使用するように設定します
apply plugin: 'java'
//すべてのサブプロジェクトが Maven 中央リポジトリを使用するように設定します
repositories{
mavenCentral()
}
//その他の共通設定
//...
}
//すべてのプロジェクトの統一設定
allprojects{
//すべてのプロジェクトが Java Gradle プラグインを使用するように設定します
apply plugin: 'java'
//すべてのプロジェクトが Maven 中央リポジトリを使用するように設定します
repositories{
mavenCentral()
}
//その他の共通設定
//...
}
構件の公開#
Gradle 構築の産物は一般に構件と呼ばれます。構築は jar パッケージや zip パッケージなどです。では、構件をどのように公開するのでしょうか。以下は、プロジェクトのローカルフォルダまたは mavenLocal () に jar 構件を公開する方法です。具体的には以下の通りです:
/**
* 構件をプロジェクトフォルダまたは mavenLocal() に公開します
*/
apply plugin : 'java'
//jar を生成するタスク。カスタム wrapper に似ています
task publishJar(type:Jar)
//構件のバージョン
version '1.0.0'
//構件は artifacts{} クロージャで設定します
artifacts{
archives publishJar
}
//構件を公開してアップロードします
uploadArchives{
repositories{
flatDir{
name 'libs'
dirs "$projectDir/libs"
}
//構築を mavenLocal() に公開します
mavenLocal()
}
}
uploadArchives タスクを実行すると、対応する位置に jar ファイルが生成されます。実行コマンドは以下の通りです:
//uploadArchives を実行
gradle uploadArchives
実行が成功すると、プロジェクトの libs ディレクトリに生成された jar ファイルが表示されます。以下の図のようになります:
実行が成功すると、ユーザーの .m2/repository ディレクトリに生成された jar ファイルが表示されます。以下の図のようになります:
以下は、jar を構築した maven プライベートリポジトリに公開する方法です。コードは以下の通りです:
/**
* 構件を maven プライベートリポジトリに公開します
*/
apply plugin : 'java'
apply plugin : 'maven'
//jar を生成するタスク。カスタム wrapper に似ています
task publishJar(type:Jar)
//構件のバージョン
version '1.0.0'
//構件は artifacts{} クロージャで設定します
artifacts{
archives publishJar
}
//構件を公開してアップロードします
uploadArchives{
repositories{
mavenDeployer{
repository(url:'http://xxx'){
//リポジトリのユーザー名とパスワード
authentication(userName:'username',password:'pass')
}
snapshotRepository(url:'http://xxx'){
authentication(userName:'username',password:'pass')
}
}
}
}
アップロードプロセスも uploadArchives タスクを実行します。maven プライベートリポジトリがある場合は、試してみてください。Java Gradle プラグインの学習はここまでです。次回は正式に Android Gradle プラグインの学習に入ります。