banner
jzman

jzman

Coding、思考、自觉。
github

GradleシリーズのJava Gradleプラグイン

前面の数篇では Gradle ビルドタスクの基本知識を学びましたので、まずは前の数篇の記事を読むことをお勧めします:

上篇文章 では Gradle プラグインに関する知識と、Gradle プラグインをカスタマイズする方法を学びました。本篇では Java Gradle プラグインに関連する知識を学びます。なぜなら、Java Gradle プラグインに関する内容は Android Gradle プラグインの基礎でもあるからです。Gradle を使用してプロジェクトを構築することは、開発者が繰り返し行う作業を助けることに他なりません。例えば、サードパーティの依存関係の設定、ソースファイルのコンパイル、単体テスト、パッケージのリリースなどです。適切な Gradle プラグインを使用することで、プロジェクトの構築が容易になり、ある程度開発効率が向上します。以下は本日学ぶ主な内容です:

  1. Java Gradle プラグインの使用
  2. Java プラグインの規約に基づくプロジェクト構造
  3. サードパーティ依存関係の設定
  4. Java プロジェクトの構築方法
  5. SourceSet の概念
  6. Java プラグインが追加できるタスク
  7. Java プラグインが追加できる属性
  8. マルチプロジェクトビルド
  9. 構件のリリース

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 プラグインに組み込まれた 2 つのソースコードセットであり、もちろん他のソースコードセットを自分で定義することもできます。定義方法は以下の通りです:

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 について理解します。これは前述のソースコードセットのことです。SourceSet は Java Gradle プラグインがソースコードとそのリソースを記述し管理するための抽象概念であり、Java ソースコードファイルとリソースファイルの集合です。したがって、ソースコード集合を通じてソースコードファイルの位置を設定したり、ソースコード集合の属性を設定したりできます。ソースセットは異なるビジネスに応じてソースコードをグループ化して管理できます。Java Gradle プラグインがデフォルトで提供する main と test のソースコードディレクトリは、ビジネスコード用と単体テスト用の 2 つのソースコードディレクトリであり、非常に便利です。

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 プロジェクトで一般的に使用されるタスクのリストです:

タスク名タイプ説明
デフォルトソースセット共通タスク
compileJavaJavaCompilejavac を使用して Java ソースファイルをコンパイルします
processResourcesCopyリソースファイルを生成されたリソースファイルディレクトリにコピーします
classesTask生成されたクラスとリソースファイルのディレクトリを組み立てます
compileTestJavaJavaCompilejavac を使用してテスト用 Java ソースファイルをコンパイルします
processTestResourcesCopyリソースファイルを生成されたリソースファイルディレクトリにコピーします
testClassesTask生成されたテストクラスと関連リソースファイルを組み立てます
jarJarjar ファイルを組み立てます
javadocJavadocjavadoc を使用して Java API ドキュメントを生成します
uploadArchivesUploadJar を含むビルドをアップロードします。archives {} クロージャを使用して設定します
cleanDeleteビルド生成のディレクトリファイルをクリーンアップします
cleanTaskNameDelete指定されたタスクで生成されたファイルを削除します。例えば、cleanJar は jar タスクで生成されたファイルを削除します
カスタムソースセットタスク(SourceSet は特定のソースセット名)
compileSourceSetJavaJavaCompilejavac を使用して指定されたソースセットのソースコードをコンパイルします
processSouceSetResourcesCopy指定されたソースセットのリソースファイルを生成ファイルのリソースディレクトリにコピーします
sourcesSetClassesTask指定されたソースセットのクラスとリソースファイルのディレクトリを組み立てます

Java プラグインが追加できる属性#

Java Gradle プラグインの一般的な属性はすべて Project に追加されており、これらの属性は直接使用できます。具体的には以下の通りです:

属性名タイプ説明
sourceSetsSourceSetContaunerJava プロジェクトのソースセット。クロージャ内で関連設定ができます
sourceCompatibilityJavaVersionJava ソースファイルをコンパイルする際に使用する Java バージョン
targetCompatinilityJavaVersionコンパイルして生成されるクラスの Java バージョン
archivesBaseNameStringjar または zip ファイルにパッケージ化する際の名前
manifestManifestmanifest マニフェストファイルにアクセスし、設定するために使用します
libsDirFile生成されたライブラリのディレクトリ
distsDirFile生成されたリリースファイルのディレクトリ

マルチプロジェクトビルド#

Gradle を使用して複数のプロジェクトを構築する場合、一般的には 1 つの主プロジェクトが他のサブモジュールプロジェクトに依存します。これらのサブプロジェクトを構築するかどうかは、Setting.gradle ファイルで設定されます。これらのサブプロジェクトを使用するには、主プロジェクト内でプロジェクト依存関係を設定する必要があります。前述の依存関係の 3 つの方法:ライブラリ依存、プロジェクト依存、ファイル依存を使用します。ここで使用されるのはプロジェクト依存です。マルチプロジェクト設定では、subprojects や allprojects がよく使用されます。具体的には以下の通りです:

//サブプロジェクトの統一設定
subprojects{
    //すべてのサブプロジェクトがJava Gradleプラグインを使用するように設定します
    apply plugin: 'java'
    //すべてのサブプロジェクトがMaven中央リポジトリを使用するように設定します
    repositories{
        mavenCentral()
    }
    //他の共通設定
    //...
}
//すべてのプロジェクトの統一設定
allprojects{
    //すべてのプロジェクトがJava Gradleプラグインを使用するように設定します
    apply plugin: 'java'
    //すべてのプロジェクトがMaven中央リポジトリを使用するように設定します
    repositories{
        mavenCentral()
    }
    //他の共通設定
    //...
}

構件のリリース#

Gradle ビルドの成果物は一般的に構件と呼ばれます。ビルドは jar パッケージや zip パッケージなどである可能性があります。では、構件をどのようにリリースするのでしょうか。以下は、jar 構件をプロジェクトのローカルフォルダまたは mavenLocal () にリリースする方法です。具体的には以下の通りです:

/**
 * 構件をプロジェクトフォルダまたは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 ファイルが表示されます。以下の図のようになります:

image

実行が成功すると、ユーザーの.m2/repository ディレクトリにも生成された jar ファイルが表示されます。以下の図のようになります:

image

以下は、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 プラグインの学習に入ります。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。