J'ai enquêté pendant un certain temps et j'ai probablement vu les réponses les plus populaires ici liées aux dépendances aar et transitive, mais d'une manière ou d'une autre, je ne sais toujours pas comment faire fonctionner cela.
Alors:
J'ai une bibliothèque Android avec une configuration de gradle donnée:
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'
}
Ensuite, je le déploie sur le repo maven local avec gradle install
. Le fichier POM de la bibliothèque déployée ressemble à ceci:
<?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>
Et enfin graduer la configuration de mon application Android en utilisant la bibliothèque ci-dessus comme dépendance:
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'
}
Et après avoir déployé l'application sur le téléphone, je reçois NoClassDefFoundError
des classes appartenant à des dépendances de compilation de ma bibliothèque Android.
Inspecter les dépendances de mes applications Android en utilisant 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
Selon l'arborescence ci-dessus, toutes les dépendances transitives ne sont pas détectées. Où est le problème et comment le faire correctement?
gradle dependencies
de votre application?provided
mot - clé? Selon Xav, ces dépendances ne sont pas incluses dans l'APK , et je pense que vous voudriez qu'elles soient emballées dans l'APK.gradle dependencies
pour ma lib android: default - Configuration des artefacts par défaut. + --- com.google.code.gson: gson: 2.2.4 + --- com.bugsense.trace: bugsense: 3.6 \ --- commons-net: commons-net: 3.3gradle dependencies
pour l' application , pas pour une bibliothèque que quelqu'un a décidé de nommer «application».Réponses:
J'ai résolu mon problème en définissant l'
transitive
attribut pour ma dépendance aar:la source
@aar
causes à Gradle pour tenter de récupérer l'artefact sous forme de fichier .jar. Cela tue la construction.compile project(':LeafPeripheralsContract') { transitive=true }
n'a pas marché. Il se plaignait de transitif. Et j'ai créé unaar
et j'ai essayé de lui ajouter de la transitive. Il ne s'est pas plaint mais il ne l'a pas inclus dans l'autre package aar.vous ne devriez pas utiliser "@aar", si utiliser "@" est devenu " Notation d'artefact seulement ", si vous voulez utiliser "@" et voulez avoir une dépendance transitive, vous devez ajouter "transitive = true"
la source
Essayez ceci si vous utilisez aar localement:
la source
J'avais un problème similaire et je sentais que je pouvais partager les étapes de résolution du problème.
L'idée de base de ne pas pouvoir utiliser les dépendances transitives pendant que vous publiez les vôtres
aar
est en fait de ne pas.pom
générer le fichier avec les dépendances transitives attendues.J'utilisais un
'maven-publish'
plugin pour maaar
dépendance Android pour le publier dans mon propre référentiel maven privé. Les dépendances transitives n'étaient pas résolues lorsque mes autres projets ajoutaient maaar
dépendance dans leurbuild.gradle
. D'où ici ce que j'ai fait pour modifier le.pom
fichier lors de la publication de monaar
.Il est important de noter ici que les dépendances dont vous souhaitez avoir le comportement transitif doivent être importées en utilisant le fichier
api
de votre projet de bibliothèquebuild.gradle
comme suit.Maintenant, comme je l'ai dit plus tôt, j'utilisais un
maven-publish
plugin pour publier laaar
dépendance et donc ma tâche de publication dans le gradle ressemble à ce qui suit.Par conséquent, j'ai utilisé une autre
mavenJava
tâche pour publier le.pom
fichier dans mon repo privé maven afin que lorsque leaar
fichier est ajouté en tant que dépendance à un autre module, il obtienne les.pom
informations et télécharge la dépendance transitive.Pour compléter la réponse, voici comment vous devez ajouter la dépendance dans le
build.gradle
fichier pour votre propre publiéaar
importé.la source
transitive
signifie que le consommateur (par exemple, une application) comprend un producteur et toutes les dépendances du producteur (par exemple des bibliothèques). Cela augmente le temps de construction et peut créer des problèmes avec les versions de dépendancePar défaut, la dépendance Gradle a
transitive = true
Lorsque vous l'utilisez,
@artifact notation
il atransitive = false
la source
Pour moi, la solution de publication complète ressemble à ceci:
Le
transitive = true
bloc est également nécessaire ...la source
Le simple fait d'ajouter @aar à la fin de la dépendance est ce qui a fonctionné pour moi.
la source