【问题标题】:Why does Gradle only include classes from my library with project dependency为什么 Gradle 只包含我的库中具有项目依赖关系的类
【发布时间】:2013-12-23 17:44:29
【问题描述】:

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

来自build.gradledependencies 部分失败:

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

如果我使用上面的dependencies 部分,MyLibrary.jar 中的任何类都不包含在构建 apk 文件中,通过提取其 classes.dex 并运行 dexdump 进行验证。我还验证了所有类都存在于我正在使用的 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。

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

【问题讨论】:

  • 你不应该有 + 的版本吗?编译'com.android.support:appcompat-v7:19+'
  • 您是要在 APK 中包含 jar 文件本身还是仅包含 jar 中的类?
  • 我只是想包含 jar 中的类。
  • 虽然如果结果是包含 jar 并将其添加到应用程序的类路径中,我也会很高兴。当我尝试使用库中的一个类时,任何可以绕过 ClassNotFoundException 的方法。
  • @Greg 你能编译你的项目,把依赖设置为compile files('libs/MyLibrary.jar')吗?

标签: java android gradle android-studio


【解决方案1】:

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

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

This answer 展示了如何修复 jar 文件的创建。这很丑陋,但它似乎有效。

【讨论】:

    【解决方案2】:

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

    来自Gradle documentation jar 任务:

    jar 任务创建一个 JAR 文件,其中包含类文件和 项目资源。

    假设由于您正在为您的项目构建jar,所有依赖项都将在运行时提供。与 war 不同,所有依赖项通常都包含在最终工件中。

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

    【讨论】:

    • 我不是在创建一个 jar,而是在创建一个 Android 应用程序。该应用程序不包括我正在尝试构建到其中的 jar 中的类。
    • 当您声明对某个库的依赖时,并不意味着该依赖将被扩展并包含在您的最终工件中,除非您明确说明。您可以查看项目的 build 目录以查看内容,并尝试使用 --info 标志运行 gradle
    • 那么我如何控制最终工件中包含的的内容?所有其他依赖项都包含其所有类,如果我将此依赖项声明为 project 依赖项而不是 files 依赖项,则包含其类。
    • 知道了。您能否将 absolute 路径设置为 MyLibrary.jar 并查看它是否包含在内。
    • 我没有看到使用绝对路径与相对路径的任何区别。
    【解决方案3】:

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

    【讨论】:

    • 我已经在使用 Android Studio 0.4.0,我想我正在使用 Gradle 插件 0.7.1。如何检查我使用的是哪个版本的 Gradle 插件?我还尝试在每次更改后进行清理和重建。
    • 如果您使用的是 android studio 0.4.0,那么您至少使用了 0.7.0 的插件并且不应该遇到这个特定的错误。所以这是别的东西,虽然我不知道是什么。
    • 我只是尝试创建一个简单的测试用例,但无法重现您的问题。我开始怀疑 Android 插件如何将来自多个 dexed sourcec.es 的 APK 链接在一起是否存在问题(基于我见过的其他类似性质的问题报告),但如果有问题,这不是一件小事一个找到
    • 据我所知,只有一个 dexed 来源。依赖项应该只是一个普通的旧 .jar 文件,而不是 dexed。目前我确实怀疑构建系统中的某个地方存在错误,但我对系统的了解不够深入,无法将其找出。
    • 找出了尝试包含 jar 文件的问题所在:jar 只有库的源文件。将问题替换为表达新问题的问题:如何为我的库创建包含类的 jar 文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多