Gradleのcompileは非推奨なのでimplementationかapiに置き換える
現在携わっているプロジェクトで、初めて 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 の利用方法を。
依存関係の伝搬
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
まとめ
今回はプロジェクトの進行中に指摘をもらえたので直すチャンスもありますが、気付かずに本運用に入っていると直しにくくなる部分でもあります。
また 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 は完全にアウトですね・・・。
直しておかなきゃ。