iku8log

Webエンジニアのタダのメモ。

gradleのapiとimplementationの指定で、依存関係を伝搬したりしなかったり

gradleのapiとimplementationの指定で、依存関係を伝搬したりしなかったりするらしい。

apiとimplementationの違いは伝搬するかどうか

gradleで以下のような記述がある

Aプロジェクト(伝搬する)

dependencies {
    api 'org.apache.commons:commons-lang3:3.7'
}

Aプロジェクト(伝搬しない)

dependencies {
    implementation 'org.apache.commons:commons-lang3:3.7'
}

違いとしては、

apiは他プロジェクトにcommons-lang3:3.7が伝搬する。つまり他のプロジェクトでも、 Aプロジェクトに依存していれば、commons-lang3:3.7が使える。

implementationは他のプロジェクトで、Aプロジェクトに依存していても、 commons-lang3:3.7は使えない。

Aプロジェクトに依存している状態というのは、以下な感じかな。

Bプロジェクト

dependencies {
    implementation project(':Aプロジェクト')
}

この例では、implementationを使っているので、Aプロジェクトで依存しているものをBで使うことは出来ない

compileは非推奨

compileはとっくに非推奨になっているので使っちゃダメ。 ちなみにcompileはapiと同じく伝搬する。

なるほどなるほど。理解できた。

参考(わかりやすい) Gradle の compile, api, implementation とかについて - Qiita