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



在我的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编译期间没有被添加到索引过程中。lib项目中指定的任何maven依赖项都可以添加到Android .apk中;它只是我的本地jar依赖项。我是不是漏掉了什么?

谢谢!

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

你有两个选择:

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

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

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

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

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

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

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

最新更新