Gradle: как включить локальный jar из зависимого проекта java в сборку Android?

в моем Android-приложении я получаю java.lang.NoClassDefFoundError когда код, который ссылается на код в зависимом .Джар казнен. Мой проект включает в себя модуль Android, а также модуль библиотеки java-only, где находится зависимость 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 не добавляется в процесс dex-ing во время компиляции Android. Любые зависимости maven, указанные в lib проект добавляется в Android .apk просто отлично; это просто моя местная зависимость от jar. Я что-то упускаю?

спасибо!

2 ответов


это невозможно напрямую, так как локальные банки не объявляются как транзитивные зависимости в Gradle.

у вас есть два варианта:

  • объедините две банки в вашей библиотеке java, чтобы выходные данные содержали локальную банку.
  • создайте другой проект без источника, только банку, и сделать проект зависит от него.

второй вариант дает вам возможность иметь более одного проекта зависит непосредственно от локальной jar (на вершина его становится транзитивной зависимостью). Для этого создайте новый проект gradle и просто поместите его build.gradle следующее:

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

Это просто зарегистрирует ваш jar как артефакт по умолчанию, опубликованный проектом, и это будет потребляться другими проектами.


в последних версиях gradle (4+, IIRC) вы можете достичь этого со следующей конфигурацией:

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

задание transitive true, когда в зависимости от другого проекта все библиотеки этого проекта будут доступны для этого проекта.