Java/Kotlin
PR

Gradleのcompileは非推奨なのでimplementationかapiに置き換える

saratogax
記事内に商品プロモーションを含む場合があります

現在携わっているプロジェクトで、初めて SpringBoot を利用しています。

今回の開発言語は Kotlin でしたが、これまで Java を使ったプロジェクトでは ant や maven を使ってビルド環境を整えていて Gradle は初めて。

Gradle では必要なパッケージを compile や implementation で指定するのですが、ライブラリの公式サイト(GitHubとか)や参考サイトの定義をそのままコピーすることもあって混在していました。

例えばこんな感じ。丸括弧の有無も含めてキレイにしたいところです。

dependencies {
    testRuntime("com.h2database:h2")
    compile("org.apache.commons:commons-lang3:3.7")
    compile("org.apache.httpcomponents:httpclient:4.5.6")
    implementation("net.java.dev.jna:jna:4.5.2")
    implementation("net.java.dev.jna:jna-platform:4.5.2")
}

まあ、初めての言語だしフレームワークだしって自分に言い訳しながら無意識に定義していたということですね・・・orz

今回はアーキテクトの方から指摘を受けたこともあり、compile や implementation、api について理解を深めておきたいと思います。

あれから Gradle のバージョンも 7.x 系になり、Java の開発で少しハマったので以下に api の利用方法を。

あわせて読みたい
【Java】Gradle7.xでライブラリ参照にapiを使用する方法
【Java】Gradle7.xでライブラリ参照にapiを使用する方法
あわせて読みたい
IntelliJ上でGradleビルド時に「Deprecated Gradle features were used in this build」が出たので調べた
IntelliJ上でGradleビルド時に「Deprecated Gradle features were used in this build」が出たので調べた

依存関係の伝搬

compile ではなく implementation や api を使う理由は大きく 2 つあります。

compileは非推奨になっている
依存関係の伝搬を明示的に表現する

compile が非推奨になっていたことは知らず、今更ながらやっちまったな状態。

定義を変えればいいだけなのですが、implementation と api の違いくらいは理解しておく。

implementationとapiの使い分け

compile では依存関係を問答無用で伝搬させれたということですが、implementation では伝搬しない。

もし意図的に伝搬させたいのであれば api を使おうねということです。

要は、伝搬意図を明示化する意味でも compile は使わない方がベターということ。

プロジェクトの build.gradle 見たら testRuntime もありましたが、こちらも非推奨となっているようです。

結局どうしたらいいの?

最終的にどうやって対応すればいいのかですが、私は以下のように変更してみました。

api よりは implementation の方が依存度が低いので、できればこちらに移行して寄せたいですね。

compile => implementation
testCompile => testImplementation
testRuntime => testRuntimeOnly

冒頭の定義をこのルールで直すと、次のようになります。

dependencies {
    testRuntimeOnly("com.h2database:h2")
    implementation("org.apache.commons:commons-lang3:3.7")
    implementation("org.apache.httpcomponents:httpclient:4.5.6")
    implementation("net.java.dev.jna:jna:4.5.2")
    implementation("net.java.dev.jna:jna-platform:4.5.2")
}

本記事は当時の Gradle 4.x での話ですが、compile / testCompile / testRuntime は Gradle 7.0 で完全に削除済みです。現行の Gradle 8.x / 9.x でも上記の置き換えがそのまま当てはまります。api を使う場合のプラグインの違いは こちらの記事にまとめています。

まとめ

今回はプロジェクトの進行中に指摘をもらえたので直すチャンスもありますが、気付かずに本運用に入っていると直しにくくなる部分でもあります。

また implementation や api の使い分けについては、下記のサイトに詳しくまとめられていました。

Gradle のリリース過程についても記述されていたので引用しておきたいと思います。

Gradle 3.4 で Java Library Plugin が追加されたことで、 dependencies で compile を使用することは非推奨となってたらしい(runtime, testCompile, testRuntime も)。

4.7 の Java Plugin の説明では、ガッツリ Deprecated と書かれている。

(4.6 のドキュメントだと Deprecated って書いてないけど、明確に非推奨となったのは最近?)

手元の環境では Gradle4.8.1 が使われているので、compile は完全にアウトですね・・・。

直しておかなきゃ。

ABOUT ME
saratoga
saratoga
フリーランスエンジニア
仕事にも趣味にも IT を駆使するフリーランスエンジニア。技術的な TIPS や日々の生活の中で深堀りしてみたくなったことを備忘録として残していきます。
記事URLをコピーしました