Я исследовал какое-то время и, вероятно, видел здесь самые популярные ответы, связанные с aar и транзитивными зависимостями, но почему-то мне все еще не ясно, как заставить это работать.
Так:
У меня есть библиотека Android с заданной конфигурацией gradle:
apply plugin: 'android-library'
apply plugin: 'android-maven'
version = "1.0.0"
group = "com.somepackage"
buildscript {
repositories {
mavenCentral()
mavenLocal()
}
dependencies {
classpath 'com.github.dcendents:android-maven-plugin:1.0'
}
}
android {
compileSdkVersion 19
buildToolsVersion '19.0.3'
defaultConfig {
minSdkVersion 10
}
}
repositories {
maven { url 'http://www.bugsense.com/gradle/' }
}
dependencies {
provided 'com.google.android.gms:play-services:+'
provided 'com.android.support:appcompat-v7:+'
compile 'com.google.code.gson:gson:2.2.4'
compile 'com.bugsense.trace:bugsense:3.6'
compile 'commons-net:commons-net:3.3'
}
Затем я развертываю его в локальном репозитории maven с помощью gradle install
. POM-файл развернутой библиотеки выглядит так:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sprezzat</groupId>
<artifactId>app</artifactId>
<version>1.0.0</version>
<packaging>aar</packaging>
<dependencies>
<dependency>
<groupId>com.bugsense.trace</groupId>
<artifactId>bugsense</artifactId>
<version>3.6</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.2.4</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
И, наконец, конфигурация Gradle моего приложения для Android, использующего указанную выше библиотеку в качестве зависимости:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.9.+'
}
}
apply plugin: 'android'
repositories {
mavenCentral()
mavenLocal()
}
android {
compileSdkVersion 15
buildToolsVersion "19.0.2"
defaultConfig {
minSdkVersion 10
targetSdkVersion 18
}
}
dependencies {
compile 'com.google.android.gms:play-services:+'
compile 'com.android.support:appcompat-v7:+'
compile 'com.somepackage:LIBRARY_NAME:1.0.0@aar'
}
И после развертывания приложения на телефоне я получаю NoClassDefFoundError
классы, принадлежащие зависимостям компиляции моей библиотеки Android.
Проверка зависимостей моего приложения для Android с помощью gradle dependencies
:
apk - Classpath packaged with the compiled main classes.
+--- com.google.android.gms:play-services:+ -> 4.3.23
| \--- com.android.support:support-v4:19.0.1 -> 19.1.0
+--- com.android.support:appcompat-v7:+ -> 19.1.0
| \--- com.android.support:support-v4:19.1.0
\--- com.somepackage:LIBRARY_NAME:1.0.0
Согласно приведенному выше дереву, все транзитивные зависимости не обнаруживаются. В чем проблема и как ее правильно сделать?
gradle dependencies
вашего приложения?provided
ключевое слово было там? Согласно Xav, такие зависимости не упакованы в APK , и я думаю, вы захотите, чтобы они были упакованы в APK.gradle dependencies
для моей библиотеки Android: по умолчанию - Конфигурация для артефактов по умолчанию. + --- com.google.code.gson: gson: 2.2.4 + --- com.bugsense.trace: bugsense: 3.6 \ --- commons-net: commons-net: 3.3gradle dependencies
для приложения , а не в библиотеке, кто - то решил назвать «приложение».Ответы:
Я решил свою проблему, установив
transitive
атрибут для моей зависимости aar:compile ('com.somepackage:LIBRARY_NAME:1.0.0@aar'){ transitive=true }
источник
@aar
причины, по которой Gradle пытается захватить артефакт как файл .jar. Это убивает сборку.compile project(':LeafPeripheralsContract') { transitive=true }
не работает. Он жаловался на переходный. И я создалaar
и попытался добавить к нему переходный. Он не жаловался, но не включил его и в другой пакет aar.вы не должны использовать «@aar», если использование «@» стало « нотацией только для артефактов », если вы хотите использовать «@» и хотите иметь транзитивную зависимость, вы должны добавить «transitive = true»
источник
Попробуйте это, если вы используете aar локально:
compile(project(:your-library-name)) { transitive=true }
источник
У меня была похожая проблема, и я чувствовал, что могу рассказать, как ее решить.
Основная идея невозможности использовать транзитивные зависимости при публикации собственных
aar
- это отсутствие.pom
файла, созданного с ожидаемыми транзитивными зависимостями.Я использовал
'maven-publish'
плагин для своейaar
зависимости от Android, чтобы опубликовать его в моем собственном частном репозитории maven. Переходные зависимости не были разрешены, когда другие мои проекты добавляли моюaar
зависимость в своиbuild.gradle
. Отсюда и то, что я сделал для изменения.pom
файла при публикации моегоaar
.Здесь важно отметить, что зависимости, которые вы хотите иметь транзитивным поведением, должны быть импортированы с использованием
api
вbuild.gradle
файле проекта библиотеки, как показано ниже.dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) api 'com.android.volley:volley:1.0.0' api "com.google.code.gson:gson:$globalGsonVersion" }
Как я уже сказал ранее, я использовал
maven-publish
плагин для публикацииaar
зависимости, и, следовательно, моя задача публикации в градиенте выглядит следующим образом.publishing { publications { mavenAar(MavenPublication) { from components.android } mavenJava(MavenPublication) { pom.withXml { def dependenciesNode = asNode().appendNode('dependencies') // Iterate over the api dependencies (we don't want the test ones), adding a <dependency> node for each configurations.api.allDependencies.each { def dependencyNode = dependenciesNode.appendNode('dependency') dependencyNode.appendNode('groupId', it.group) dependencyNode.appendNode('artifactId', it.name) dependencyNode.appendNode('version', it.version) } } } } repositories { maven { // Your repository information goes here } } }
Следовательно, я использовал другую
mavenJava
задачу для публикации.pom
файла в моем частном репозитории maven, чтобы приaar
добавлении файла в качестве зависимости к другому модулю он получал.pom
информацию и загружал транзитивную зависимость.Чтобы завершить ответ, вот как вы должны добавить зависимость в
build.gradle
файл для вашего собственного, опубликованногоaar
для меня, импортированного.api('com.example.masudias:my_lib:1.0.0@aar') { transitive = true }
источник
transitive
означает, что потребитель (например, приложение) включает производителя и все зависимости производителя (например, библиотеки). Это увеличивает время сборки и может создать некоторые проблемы с версиями зависимостей.По умолчанию зависимость Gradle имеет
transitive = true
api ('com.package:library:0.0.1') //the same api ('com.package:library:0.0.1') { transitive = true }
Когда вы
@artifact notation
его используетеtransitive = false
api ('com.package:library:0.0.1@aar') //the same api ('com.package:library:0.0.1@aar') { transitive = false }
источник
Для меня полное издательское решение выглядит так:
apply plugin: 'com.github.dcendents.android-maven' group = GROUP version = VERSION // you could move it to env variable or property def publishFlavorless = true def firstTask = null android.libraryVariants.all { variant -> if (variant.name.toLowerCase().contains("debug")) { // Workaround for https://github.com/gradle/gradle/issues/1487 if (publishFlavorless && firstTask == null) { def bundleTask = tasks["bundle${variant.name.capitalize()}Aar"] firstTask = bundleTask artifacts { archives(firstTask.archivePath) { builtBy firstTask name = project.name } } } return } def bundleTask = tasks["bundle${variant.name.capitalize()}Aar"] artifacts { archives(bundleTask.archivePath) { classifier variant.flavorName builtBy bundleTask name = project.name } } } install { repositories.mavenInstaller { // This generates POM.xml with proper parameters pom.project { name POM_NAME artifactId POM_ARTIFACT_ID // For aar it is equal to 'aar' with jar transitive dependencies won't work packaging POM_PACKAGING description POM_DESCRIPTION } } }
transitive = true
Блок требуется , а также ...источник
Простое добавление @aar в конце зависимости - вот что сработало для меня.
dependencies { implementation 'org.videolan.vlc:libvlc:3.0.13@aar' }
источник