Ответ на этот вопрос будет продемонстрировать разницу между implementation
, api
и compile
на проекте.
Допустим, у меня есть проект с тремя модулями Gradle:
- приложение (приложение для Android)
- myandroidlibrary (библиотека Android)
- myjavalibrary (библиотека Java)
app
имеет myandroidlibrary
как зависимости. myandroidlibrary
имеет myjavalibrary
как зависимости.
myjavalibrary
имеет MySecret
класс
public class MySecret {
public static String getSecret() {
return "Money";
}
}
myandroidlibrary
имеет MyAndroidComponent
класс, который манипулирует значением из MySecret
класса.
public class MyAndroidComponent {
private static String component = MySecret.getSecret();
public static String getComponent() {
return "My component: " + component;
}
}
Наконец, app
интересует только значение изmyandroidlibrary
TextView tvHelloWorld = findViewById(R.id.tv_hello_world);
tvHelloWorld.setText(MyAndroidComponent.getComponent());
Теперь поговорим о зависимостях ...
app
потреблять :myandroidlibrary
, поэтому в app
build.gradle пользуйтесь implementation
.
( Примечание : вы также можете использовать api / compile. Но подождите немного.)
dependencies {
implementation project(':myandroidlibrary')
}
Как вы думаете, myandroidlibrary
как должен выглядеть build.gradle? Какой объем мы должны использовать?
У нас есть три варианта:
dependencies {
// Option #1
implementation project(':myjavalibrary')
// Option #2
compile project(':myjavalibrary')
// Option #3
api project(':myjavalibrary')
}
В чем разница между ними и что я должен использовать?
Компиляция или API (вариант № 2 или № 3)
Если вы используете compile
или api
. Наше приложение для Android теперь может получить доступ к myandroidcomponent
зависимости, которая является MySecret
классом.
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can access MySecret
textView.setText(MySecret.getSecret());
Реализация (вариант № 1)
Если вы используете implementation
конфигурацию, MySecret
не подвергается.
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can NOT access MySecret
textView.setText(MySecret.getSecret()); // Won't even compile
Итак, какую конфигурацию вы должны выбрать? Это действительно зависит от вашего требования.
Если вы хотите выставить зависимости, используйте api
или compile
.
Если вы не хотите раскрывать зависимости (скрывая свой внутренний модуль), используйте implementation
.
Замечания:
Это просто суть конфигураций Gradle, см. Таблицу 49.1. Плагин библиотеки Java - конфигурации, используемые для объявления зависимостей для более подробного объяснения.
Пример проекта для этого ответа доступен по адресу https://github.com/aldoKelvianto/ImplementationVsCompile.