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

时间:2013-12-23 17:44:30

标签: java android gradle android-studio

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

来自dependencies的{​​{1}}部分失败:

build.gradle

如果我使用上面的dependencies { compile 'com.android.support:appcompat-v7:+' compile files('libs/MyLibrary.jar') } 部分,则MyLibrary.jar中的任何类都不包含在构建apk文件中,通过提取其classes.dex和运行dexdump进行验证。我还验证了所有类都存在于我正在使用的jar文件中。

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

dependencies

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

这里发生了什么?我真的想用API级别18 sdk构建我的应用程序以测试兼容性,但除非我能够将jar文件用于我的库,否则我无法工作。

3 个答案:

答案 0 :(得分:3)

好的,这是我的错。我的库的build.gradle配置为只包含jar输出文件中的源文件。以下是不正确的 Gradle代码,会给您带来与我相同的问题。

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

This answer显示了如何修复jar文件的创建。这很难看,但似乎有用。

答案 1 :(得分:1)

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

来自jar任务的Gradle documentation

  

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

它假定您为项目构建jar,因此将在运行时期间提供所有依赖项。与war相反,其中所有依赖项通常都包含在最终工件中。

如果你需要创建包含依赖项的“fat jar”,那么请查看特定的插件,例如gradle-fatjar-plugin

答案 2 :(得分:0)

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