为什么Gradle只包含来自我的库的具有项目依赖性的类

我正在构build一个依赖于自定义库的Android应用程序,当我使用项目依赖项时,Gradle只会包含我的自定义库,而不是当我使用文件依赖项来包含库的jar文件时。 我正在用API levee 19 SDK构build我的应用程序和库。

build.gradle失败的dependencies部分:

 dependencies { compile 'com.android.support:appcompat-v7:+' compile files('libs/MyLibrary.jar') } 

如果我使用上面的dependencies部分,没有任何MyLibrary.jar中的类包含在构buildapk文件中,通过提取其classes.dex和运行dexdump来validation。 我还validation了所有的类都存在于我正在使用的jar文件中。

如果我使用下面的dependencies部分,那么MyLibrary中的所有类都包含在apk文件中:

 dependencies { compile 'com.android.support:appcompat-v7:+' compile project(':MyLibrary') } 

我使用的是Android Studio 0.4.0,Gradle 1.9,我认为Gradle插件0.7.1。

这里发生了什么? 我真的想build立我的应用程序的API级别18 sdk来testing兼容性,但我不能得到那个工作,除非我能够使用我的库的jar文件。

Solutions Collecting From Web of "为什么Gradle只包含来自我的库的具有项目依赖性的类"

好的,这是我的错。 我的库的build.gradle被configuration为只包含jar文件中的源文件。 以下是不正确的 Gradle代码,会给你和我一样的问题。

 task jar(type: Jar) { from android.sourceSets.main.java } 

这个答案显示了如何修复jar文件的创build。 这是丑陋的,但似乎工作。

Jar任务不包括最终jar工件中的依赖项。

从jar任务的Gradle文档 :

jar任务创build一个包含项目的类文件和资源的JAR文件。

它假定,因为您正在为您的项目构buildjar ,所以所有的依赖项将在运行时提供。 与war相反,所有依赖通常都包含在最终的工件中。

如果你需要创build“fat jar”,它将包含依赖项,然后查看特定的插件,例如gradle-fatjar-plugin 。

这有点长,但如果你没有使用Android Studio 0.4.0,并且刚刚添加了jar文件,请尝试清理项目并从头开始重build。 我们已经看到了这个bug: https : //code.google.com/p/android/issues/detail?id=63366在不清理项目的情况下库不会被包含在内,尽pipe这个bug指的是从Maven下载的依赖而不是一个本地的jar文件(这可能是也可能不是一个重要的区别)。 这在Android Studio 0.4.0(更具体地说,在Gradle插件0.7.0中)中得到了修复。