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, когда в зависимости от другого проекта все библиотеки этого проекта будут доступны для этого проекта.