Відповідь на це питання буде продемонструвати різницю між 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 Library - конфігурації, які використовуються для оголошення залежностей для більш детального пояснення.
Зразок проекту для цієї відповіді доступний на https://github.com/aldoKelvianto/ImplementationVsCompile