Gradle 依賴關係中 compile和 implementation的區別

將在一個項目中展現implementation,api以及compile之間的差別。html

假設我有一個包含三個Gradle模塊的項目:java

  • app(Android應用)
  • my-android-library(Android庫)
  • my-java-library(Java庫)

app具備my-android-library與依賴。my-android-library具備my-java-library依賴。android

依賴1

my-java-library有一個MySecret班git

public class MySecret {

    public static String getSecret() {
        return "Money";
    }
}

my-android-library 擁有一個類 MyAndroidComponent,裏面有調用 MySecret 類的值。github

public class MyAndroidComponent {

    private static String component = MySecret.getSecret();

    public static String getComponent() {
        return "My component: " + component;
    }    
}

最後,app 只對來自 my-android-libraryapi

TextView tvHelloWorld = findViewById(R.id.tv_hello_world);
tvHelloWorld.setText(MyAndroidComponent.getComponent());

如今,讓咱們談談依賴性...app

app須要:my-android-library庫,因此在app build.gradle文件中使用implementationide

(注意:您也能夠使用api/compile, 可是請稍等片刻。)gradle

dependencies {
    implementation project(':my-android-library')      
}

依賴2

您認爲 my-android-library 的 build.gradle應該是什麼樣?咱們應該使用哪一個範圍?ui

咱們有三種選擇:

dependencies {
    // 選擇 #1
    implementation project(':my-java-library') 
    // 選擇 #2
    compile project(':my-java-library')      
    // 選擇 #3
    api project(':my-java-library')           
}

依賴3

它們之間有什麼區別,我應該使用什麼?

compile 或 api(選項#2或#3)

依賴4

若是您使用 compile 或 api。咱們的 Android 應用程序如今能夠訪問 MyAndroidComponent 依賴項,它是一個MySecret 類。

TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// 你能夠訪問 MySecret
textView.setText(MySecret.getSecret());

implementation(選項1)

依賴5

若是您使用的是 implementation 配置,MySecret 則不會公開。

TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// 你沒法訪問 MySecret 類
textView.setText(MySecret.getSecret()); // 沒法編譯的

那麼,您應該選擇哪一種配置?取決於您的要求。

若是要公開依賴項,請使用 apicompile

若是您不想公開依賴項(隱藏您的內部模塊),請使用implementation

注意:
這只是 Gradle 配置的要點,請參閱 表49.1 Java庫插件-用於聲明依賴的配置,有更詳細的說明。

可在https://github.com/aldoKelvia... 上找到此答案的示例項目。

相關文章
相關標籤/搜索