Gradle:如何在Android版本中包含来自依赖java项目的本地jar?

时间:2014-03-12 18:31:51

标签: java android jar gradle android-gradle

在我的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依赖。有什么我想念的吗?

谢谢!

2 个答案:

答案 0 :(得分:6)

这不可能直接实现,因为Gradle中没有将本地jar声明为传递依赖。

您有两种选择:

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

第二个选项使您能够让多个项目直接依赖于本地jar(在它之上成为传递依赖)。要做到这一点,请创建一个新的gradle项目,然后只需输入build.gradle以下内容:

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

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

答案 1 :(得分:0)

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

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

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