【问题标题】:Gradle: how do I include a local jar from a dependent java project in an Android build?Gradle:如何在 Android 构建中包含来自依赖 java 项目的本地 jar?
【发布时间】:2014-04-17 03:09:27
【问题描述】:

在我的 Android 应用程序中,当执行引用依赖 .jar 中的代码的代码时,我会收到 java.lang.NoClassDefFoundError。我的项目包括一个 Android 模块以及一个仅限 java 的库模块,这是 jar 依赖项所在的位置。我正在使用 gradle 1.10 来构建项目。这是我的项目布局:

myProject
- app (Android)
  - src
  - build.gradle

- lib (java)
  - src     
  - libs
    - local-dependency.jar
  - build.gradle

- build.gradle
- settings.gradle

主项目build.gradle 是空白的,而主项目settings.gradle 看起来像:

include ':app', ':lib'

Android 应用 build.gradle 看起来像:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.8.+'
    }
}

apply plugin: 'android'

repositories {
    mavenCentral()
}

android {
    compileSdkVersion 18
    buildToolsVersion "19.0.2"

    defaultConfig {
        minSdkVersion 18
        targetSdkVersion 18
        versionCode 1
        versionName "1.0"
    }
}

dependencies {
    compile project(':lib')
}

图书馆build.gradle是:

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile <some-dependency-in-maven>
    compile files('libs/local-dependency.jar') 
}

一切编译和打包都没有错误,我在 IDE (IntelliJ 13) 中没有看到任何错误。出于某种原因,我的 local-dependency.jar 在 Android 编译期间没有被添加到 dex-ing 进程中。 lib 项目中指定的任何 maven 依赖项都可以添加到 Android .apk 中;这只是我的本地 jar 依赖项。我有什么遗漏吗?

谢谢!

【问题讨论】:

  • 您可能还想尝试在 android 项目中包含依赖 jar 来看看是否可行。
  • 嗯,是的,当我更改我的 Android 应用程序 build.gradle 依赖项部分以添加 compile files('../lib/libs/local-dependency.jar') 时,它似乎有效。但是有没有办法让它工作而不必让 Android 应用程序 build.gradle 必须知道依赖项的依赖项?

标签: java android jar gradle android-gradle-plugin


【解决方案1】:

这不是直接可能的,因为本地 jar 没有在 Gradle 中声明为传递依赖项。

你有两个选择:

  • 合并 java 库中的两个 jar,以便输出包含本地 jar。
  • 创建一个没有源的不同项目,只有 jar,并使项目依赖它。

第二个选项使您能够让多个项目直接依赖于本地 jar(在它之上成为传递依赖项)。为此,创建一个新的 gradle 项目并在其 build.gradle 中输入以下内容:

configurations.create("default")
artifacts.add("default", file('somelib.jar'))

这只是将您的 jar 注册为项目发布的默认工件,这将被其他项目使用。

【讨论】:

  • 这是否意味着在父项目中你将把它放在它的 build.gradle: dependencies { 中。 . .编译项目(':shared-jars') 。 . . }
  • 是的。这意味着该父项目会将其作为其依赖项发布给可能使用它的其他项目(父项目)。
  • 我无法让它工作。当您说创建一个新项目时,您是指一个新的 Java 模块吗?我创建了一个 Java 模块并尝试了这个,但我遇到了一个或另一个问题。如果我在 shared-jars 模块的 build.gradle 中执行“应用插件:'java'”,Gradle 会抱怨“默认”配置已经存在。如果我不应用 Java 插件,那么它会抱怨在 shared-jars 中没有 assemble 任务。我尝试注释掉configurations.create() 行。在这里一切都正确编译,但我在运行时得到 NoClassDef 。也许我错过了一些基本的东西。
  • 只需使用“New Module”并选择“Import Jar or Aar”选项,它将创建包装jar的模块,只将我上面提到的行放在你的build.gradle中。
  • @XavierDucrohet 谢谢 - 使用新模块 --> Import Jar 选项对我有用。使用这种方法将多个相关的 JAR 文件组合到一个模块中是否有任何最佳实践?
【解决方案2】:

在最近(4+,IIRC)版本的 gradle 中,您可以通过以下配置实现此目的:

compile (project(':ProjectIDependOn')) {
  transitive = true
}

当依赖于另一个项目时将transitive 设置为true 会将那个项目的所有库公开给这个项目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-27
    • 2016-07-06
    • 2014-04-24
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    相关资源
    最近更新 更多