Java

Gradleのcompileは非推奨なのでapiかimplementationを使う

夏頃から携わっているプロジェクトで初めて SpringBoot を利用しています。

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

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

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

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

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

依存関係の伝搬

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

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

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

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

implementationとapiの使い分け

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

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

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

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

まとめ

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

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

qiita.com

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

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

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

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

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

直しておかなきゃ。