如何为android+;格拉德尔

如何为android+;格拉德尔,android,jar,compilation,gradle,dependency-management,Android,Jar,Compilation,Gradle,Dependency Management,我有一个Android应用程序项目,它依赖于一个香草Java项目(“:Common”):Common依赖于位于Java项目“lib”目录中的Guava。android项目中的java代码引用了Guava类(例如“list”类)以及在“:Common”中定义的类。android项目的编译失败,因为无法找到“Lists”类,但能够找到“:Common”本身中定义的类。我知道这是一种在纯Java场景中正常工作的配置,但我不明白为什么在这个Android案例中它会失败 注意:将“compilefilet

我有一个Android应用程序项目,它依赖于一个香草Java项目(“:Common”):Common依赖于位于Java项目“lib”目录中的Guava。android项目中的java代码引用了Guava类(例如“list”类)以及在“:Common”中定义的类。android项目的编译失败,因为无法找到“Lists”类,但能够找到“:Common”本身中定义的类。我知道这是一种在纯Java场景中正常工作的配置,但我不明白为什么在这个Android案例中它会失败

注意:将“compilefiletree(dir:'../Common/lib',include:['*.jar'])添加到Android项目的依赖项中修复了编译错误,但显然这是次优的(您不必像gradle那样在两个地方定义依赖项)

我的android项目的build.gradle文件如下所示:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 20
    buildToolsVersion "20.0.0"

    defaultConfig {(omitted)}

    sourceSets {
        main.manifest.srcFile 'AndroidManifest.xml'
        main.java.srcDirs = ['src']
        main.resources.srcDirs = ['resources']
        main.res.srcDirs = ['res']
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile (project(':Common'))
}
apply plugin: 'java'

sourceSets {
    main.java.srcDirs = ['src']
}

dependencies {
    compile (fileTree(dir: 'lib', includes: ['*.jar']))
}
我的java库项目(“:Common”)的build.gradle文件如下所示:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 20
    buildToolsVersion "20.0.0"

    defaultConfig {(omitted)}

    sourceSets {
        main.manifest.srcFile 'AndroidManifest.xml'
        main.java.srcDirs = ['src']
        main.resources.srcDirs = ['resources']
        main.res.srcDirs = ['res']
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile (project(':Common'))
}
apply plugin: 'java'

sourceSets {
    main.java.srcDirs = ['src']
}

dependencies {
    compile (fileTree(dir: 'lib', includes: ['*.jar']))
}

解决这个问题的一个非常简单的方法是将guava声明为公共项目的远程依赖项,并让Gradle在构建时解决它。远程依赖关系是可传递的,您的应用程序将通过依赖公共关系来获得它

尝试将以下行添加到公共项目的build.gradle中:

dependencies {
  compile 'com.google.guava:guava:18.0'
}
然后配置基础存储库,如Maven Central:

repositories {
  mavenCentral()
}

然后从lib/文件夹中删除GuavaJAR文件。

有趣的是,当设置为远程时,依赖关系确实会变得可传递。这无疑是一个比我目前所做的更干净的解决方案,但实际上我正在寻找一种方法,使本地依赖关系具有可传递性(使维护Eclipse兼容性更容易)。这种不一致的短暂行为确实让人觉得它可能只是Android Gradle插件中的一个bug。