【问题标题】:Share external dependencies between modules in Android Studio在 Android Studio 中的模块之间共享外部依赖项
【发布时间】:2015-03-21 00:18:32
【问题描述】:

我正在尝试在 Android Studio 中的 2 个模块之间共享 2 个外部依赖项。 两个依赖项是 Twitter Core 和 Twitter4j(我正在试验的 Twitter 库扩展)。

这是项目结构:

Root project 'cineios-test'
+--- Project ':app'
\--- Project ':cineio-broadcast-android-sdk'

我在我的应用程序 build.gradle 文件中设置了依赖项:

apply plugin: 'com.android.application'
apply plugin: 'io.fabric'

buildscript {
    repositories {
        maven { url 'https://maven.fabric.io/public' }
    }

    dependencies {
        classpath 'io.fabric.tools:gradle:1.+'
    }
}

repositories {
    maven { url 'https://maven.fabric.io/public' }
}


android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.example.lgorse.cineios_test"
        minSdkVersion 18
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    packagingOptions{
        exclude 'META-INF/LICENSE.txt'
    }
}


dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
    compile project(':cineio-broadcast-android-sdk')
    //compile project(':cineio-broadcast-android')
    //compile 'io.cine:cineio-broadcast-android-sdk:0.0.9'
    compile ('org.twitter4j:twitter4j-stream:4.0.2'){
        transitive = true;
    }
    compile('com.twitter.sdk.android:twitter:1.1.1@aar') {
        transitive = true;
    }

}

这里是模块的build.gradle文件,即cineios-android-sdk:

apply plugin: 'android-library'

android {
    compileSdkVersion 19
    buildToolsVersion '19.1.0'
    defaultConfig {
       // applicationId 'io.cine.android'
        minSdkVersion 18
        targetSdkVersion 19
        versionCode 11
        versionName '0.0.11'
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
    }
}

dependencies {
    compile 'com.google.guava:guava:16.0'
    compile 'com.loopj.android:android-async-http:1.4.5'
    compile 'com.android.support:appcompat-v7:20.0.0'
    compile 'com.android.support:support-v4:20.0.0'


}

最后是settings.gradle:

include ':app', ':cineio-broadcast-android-sdk'
project(':cineio-broadcast-android-sdk').projectDir = new File('cineio-broadcast-android/cineio-broadcast-android-sdk')

我知道有关于 SO 的答案,但他们提到将本地库添加为模块 - 但由于这些依赖项是远程的,我不确定如何根据这种情况调整提示。

我确实尝试将依赖项添加到另一个模块 (cineios-android) 但 a) 像这样将它们加倍似乎很荒谬 b) 这意味着在 Twitter API 中注册一个新应用程序,这可能会导致错误。

【问题讨论】:

    标签: android twitter gradle android-studio dependencies


    【解决方案1】:

    在你的 build.gradle 中添加如下依赖:

    dependencies {
    compile 'org.openimaj:twitter:1.3.1'
    

    }

    您也可以使用以下链接获取更多参考: Gradle Please

    【讨论】:

    • 嘿 Karan 你推荐的和我已经做的有什么区别?重要的是那个特定的依赖库吗?
    • 你已经编译了 Twitter API 的两个依赖项,我的回答是,只有一个 twitter 依赖项,很容易将 twitter 客户端集成到你的项目中。
    • 嗯。我认为您的回答解决了冗余 API 的问题,但没有解决我如何从 cineio-android 模块访问主模块中的 Twitter 依赖项。
    • 我认为你不需要为cineio添加项目,只需添加依赖项:dependencies { compile 'io.cine:cineio-broadcast-android-sdk:0.0.11' }。跨度>
    【解决方案2】:

    正确的做法是在主应用程序和模块中指定依赖关系。

    我确实尝试将依赖项添加到另一个模块 (cineios-android) 但 a) 像这样将它们加倍似乎很荒谬

    这真的没有什么可笑的。不要认为它试图“共享”主应用程序和模块之间的依赖关系。这样看:你的模块依赖于 Twitter4j 和 Twitter Core。如果您要在不同的应用程序中重用该模块,则该模块应该是自包含的,并且应该能够指定自己的依赖项,而无需父项目设置它们。明确其所有依赖项就是这样做的。

    如果父应用也依赖于 Twitter4j 和 Twitter Core,并且如果你使用 Maven Coordinate 风格的远程依赖规范,构建系统将确保只有一个副本实际链接到应用中,所以一切都会没事。

    b)这意味着在 Twitter API 中注册一个新应用程序,这可能会导致错误。

    我不熟悉它是如何工作的,所以我无法对此发表评论,只能说如果他们的 API 设计得很好,希望仅仅包含库不应该暗示这样的事情。如果您遇到问题,请澄清您的问题或提出新问题。

    【讨论】:

    • 我喜欢这个答案,因为它解释了为什么我的两个前提都是错误的,并增加了我对依赖项如何工作的理解。谢谢!
    • 我真的很喜欢这个答案,有没有关于这个的官方文档?
    猜你喜欢
    • 2015-10-28
    • 2019-02-15
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    相关资源
    最近更新 更多