He investigado un tiempo y probablemente vi las respuestas más populares aquí relacionadas con las dependencias aar y transitivas, pero de alguna manera todavía no me queda claro cómo hacer que esto funcione.
Entonces:
Tengo una biblioteca de Android con la configuración gradle dada:
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'
}
Luego lo estoy implementando en el repositorio local de maven con gradle install. El archivo POM de la biblioteca implementada tiene este aspecto:
<?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>
Y finalmente gradle config de mi aplicación de Android usando la biblioteca anterior como dependencia:
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'
}
Y después de implementar la aplicación en el teléfono, obtengo NoClassDefFoundErrorclases que pertenecen a compilar dependencias de mi biblioteca de Android.
Inspeccionando las dependencias de mi aplicación de Android usando 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
Según el árbol anterior, no se detectan todas las dependencias transitivas. ¿Dónde está el problema y cómo se debe hacer correctamente?

gradle dependenciesde su aplicación?providedpalabra clave allí? Según Xav, tales dependencias no están empaquetadas en el APK , y creo que querría que estuvieran empaquetadas en el APK.gradle dependenciespara mi lib de Android: predeterminado: configuración para artefactos predeterminados. + --- com.google.code.gson: gson: 2.2.4 + --- com.bugsense.trace: bugsense: 3.6 \ --- commons-net: commons-net: 3.3gradle dependenciespara la aplicación , no para una biblioteca que alguien decidió llamar "aplicación".Respuestas:
He resuelto mi problema estableciendo un
transitiveatributo para mi dependencia de aar:fuente
@aarcausas hace que Gradle intente tomar el artefacto como un archivo .jar. Esto mata la construcción.compile project(':LeafPeripheralsContract') { transitive=true }no funcionó. Se quejó de transitivo. Y creé unaary traté de agregarle transitivo. No se quejó, pero tampoco lo incluyó en el otro paquete aar.no debe usar "@aar", si el uso de "@" se convierte en " Notación de solo artefacto ", si desea usar "@" y desea tener dependencia transitiva, debe agregar "transitive = true"
fuente
Pruebe esto si está usando aar localmente:
fuente
Tenía un problema similar y sentí que podía compartir los pasos para resolverlo.
La idea básica de no poder usar las dependencias transitivas mientras publica las suyas
aares en realidad no tener el.pomarchivo generado con las dependencias transitivas esperadas.Estaba usando un
'maven-publish'complemento para miaardependencia de Android para publicarlo en mi propio repositorio privado de maven. Las dependencias transitivas no se resolvieron cuando mis otros proyectos agregaban miaardependencia en subuild.gradle. De ahí lo que hice para modificar el.pomarchivo mientras publicaba miaar.Una cosa importante a tener en cuenta aquí es que las dependencias que desea que tengan el comportamiento transitivo deben importarse usando el archivo
apidel proyecto de su bibliotecabuild.gradlecomo se muestra a continuación.Ahora, como dije antes, estaba usando un
maven-publishcomplemento para publicar laaardependencia y, por lo tanto, mi tarea de publicación en el gradle se ve así.Por lo tanto, utilicé otra
mavenJavatarea para publicar el.pomarchivo en mi repositorio de maven privado para que cuando elaararchivo se agregue como una dependencia a algún otro módulo, obtenga la.pominformación y descargue la dependencia transitiva.Para completar la respuesta, así es como debe agregar la dependencia en el
build.gradlearchivo para su propia publicaciónaarque me importó.fuente
transitivesignifica que el consumidor (por ejemplo, la aplicación) incluye un productor y todas las dependencias del productor (por ejemplo, bibliotecas). Aumenta el tiempo de compilación y puede crear algunos problemas con las versiones de dependencia.De forma predeterminada, la dependencia de Gradle tiene
transitive = trueCuando lo usas
@artifact notationtienetransitive = falsefuente
Para mí, la solución de publicación completa se ve así:
El
transitive = truebloque también es necesario ...fuente
Simplemente agregando @aar al final de la dependencia es lo que funcionó para mí.
fuente