gradle Kotlin,Java Spring

【Gradle備忘】implementation,runtimeOnly...などの違い

Gradle使ってて「implementation」とか「runtimeOnly」とかあるけど、これ何が違うんだ??となったのでメモ。

依存のさせ方意味
implementation依存関係を定義する。一番一般的なもの。
apiimplementationとベースは一緒だが、依存が伝播する
runtimeOnlyコンパイルする時には要らないけど、実行時には必要なやつ。
compileOnly実行する時には要らないけど、コンパイル時には必要なやつ。

runtimeOnlyを使う例

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    runtimeOnly 'org.postgresql:postgresql:42.3.8'
}
  • JPAでコード書いたら「コンパイルしないといけないし、実行時にも必要」なのでimplementation
  • DBのドライバは実行時にあればいいので、runtimeOnly

compileOnlyを使う例

  • Lombokの役割は「我々が書くソースファイルにおけるボイラープレートコード(GetterとかSetterとか)の排除」
  • ソースファイルから実行ファイル作る(=compile)ときに自動でGetter Setter作ってもらうだけ。実行時には意味なし。
  • なのでcompileOnly
dependencies {
    compileOnly 'org.projectlombok:lombok:1.18.30'
    annotationProcessor 'org.projectlombok:lombok:1.18.30'
}

apiの挙動

// Aモジュールのbuild.grale
// JPAを利用
dependencies {
    api 'org.springframework.boot:spring-boot-starter-data-jpa'
}

// Bモジュールのbuild.grale
// Aに依存している
dependencies {
    implementation project(':A')
}

この時、BモジュールでもJPAが使えて、関連クラスがimportできたりする。(依存関係が伝播していく)

(Bモジュールの保守チームからしたら、暗黙的に定義されたAの依存関係も意識しないといけないから、めんどくさそう...)

とは言っても、どう使い分ける?

以下、山根の意見です。

  • 基本は全部implemetationで良さそう。
  • よっぽどの理由がない限り、apiは基本使わない方向が良さそう。(必要になるケースがあまり思いつかない。。)
  • runtimeOnly/compileOnly/implementationにするか迷うぐらいなら、基本はimplementationを選択する、で良さそう。ビルドが軽くなるメリットより、判断コストが大きくなるデメリットの方が大きい気がする。正しい依存のさせ方については、「アプリが大きくなって、ビルド時間を短くしたくなってきたら」考えることのような気がする。

元ネタ

https://docs.gradle.org/current/userguide/java_library_plugin.html#java_library_plugin
https://docs.gradle.org/current/userguide/dependency_configurations.html

人気記事

1

バグが見つかった →他の場所も似たような観点で怪しいな...?? →横展開調査だ! →結構範囲広いな...一人でやってると間に合わないし見落とし起きるぞ... みたいな時に、「人を巻き込みながら広域調 ...

2

最近、「ちっちゃいチーム編成を考える」経験をしました。 この記事では、「エンジニアのチーム編成する時ってこういうことも考えないといけないのか〜」という学びについて記載します。 特に育成の観点が自分の頭 ...

3

「すでに走り出しているチームの現場リーダーをやる」経験はあったのですが、この度「新しくチームを立ち上げて、そのままリーダーをやる」ことになりました。似ているようで微妙に違う部分があり、以前より考えなけ ...

4

「SCRUM BOOT CAMP」の本を読みました。 書籍の内容を紹介しつつ、その中で気づいたことや、現場開発で試してみたいことについてメモります。 https://www.amazon.co.jp/ ...

-gradle, Kotlin,Java, Spring