Android Gradle包含另一个模块中的模块依赖项

时间:2017-10-02 13:26:01

标签: android dependencies android-gradle

我正在使用最新的Android Studio 3.0.0-beta6来构建我的Android项目,并且存在这种依赖性问题。 Gradle鼓励我将所有compile's替换为implementation's。这是我的项目结构:

项目:

  • 模块1

    • 模块2

Module1依赖于某些库,module2依赖于module1。但是,module1中的库在module2中不可见。我不想复制粘贴依赖项,而是希望只声明一次库依赖项。有一个简单的解决方案吗?谢谢。

module1的构建gradle:

dependencies {
    ....
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
    ...
}

module2的构建gradle:

implementation project(':module1')

2 个答案:

答案 0 :(得分:5)

在根项目中 - > build.gradle你应该有类似的东西:

allprojects {
    repositories {
        jcenter()
    }
}

在那里添加依赖项!!

<强>更新

如果您不希望所有模块都具有公共依赖关系,而只希望具有特定模块,请执行以下操作:

  1. 在Root Project / gradleScript中创建一个文件夹
  2. 在此文件夹中创建.gradle文件(例如gradleScript / dependencies.gradle) 看起来像是:

    ext {
    
    //Version
    
    supportLibrary = '22.2.1'
    
    //Support Libraries dependencies
    supportDependencies = [
            design           :         "com.android.support:design:${supportLibrary}",
            recyclerView     :         "com.android.support:recyclerview-v7:${supportLibrary}",
            cardView         :         "com.android.support:cardview-v7:${supportLibrary}",
            appCompat        :         "com.android.support:appcompat-v7:${supportLibrary}",
            supportAnnotation:         "com.android.support:support-annotations:${supportLibrary}",
    ]
    }
    
  3. 在根项目build.gradle中添加以下行:

    buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
    }
    }
    
    // Load dependencies
    apply from: 'gradleScript/dependencies.gradle'
    
  4. 在您的模块中相应地添加:

    // Module build file
    
    dependencies {
        //......
        compile supportDependencies.appCompat
        compile supportDependencies.design
    }
    
  5. 希望这有帮助!!!

答案 1 :(得分:1)

一个老问题,但是在我看来,您追求的只是在gradle文件中使用api而不是implementation

如果模块X声明了api依赖关系,则该依赖项可传递给依赖X的任何其他模块。但是,如果它声明了implementation依赖关系,则该依赖关系中的类将放在该类上模块X的路径,但不会依次依赖于模块X的任何模块。

来自Gradle的documentation

出现在api配置中的依赖项将传递给库的使用者,并因此出现在使用者的编译类路径上。另一方面,在实现配置中发现的依赖关系不会暴露给使用者,因此不会泄漏到使用者的编译类路径中。

具体来说:

模块1:

dependencies {
    ....
    api 'io.reactivex.rxjava2:rxandroid:2.0.1'
    api 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
    ...
}

模块2:

implementation project(':module1')

这不是您要尝试做的最简单的解决方案吗?