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 NoClassDefFoundError
clases 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 dependencies
de su aplicación?provided
palabra 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 dependencies
para 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 dependencies
para la aplicación , no para una biblioteca que alguien decidió llamar "aplicación".Respuestas:
He resuelto mi problema estableciendo un
transitive
atributo para mi dependencia de aar:fuente
@aar
causas 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é unaar
y 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
aar
es en realidad no tener el.pom
archivo generado con las dependencias transitivas esperadas.Estaba usando un
'maven-publish'
complemento para miaar
dependencia de Android para publicarlo en mi propio repositorio privado de maven. Las dependencias transitivas no se resolvieron cuando mis otros proyectos agregaban miaar
dependencia en subuild.gradle
. De ahí lo que hice para modificar el.pom
archivo 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
api
del proyecto de su bibliotecabuild.gradle
como se muestra a continuación.Ahora, como dije antes, estaba usando un
maven-publish
complemento para publicar laaar
dependencia y, por lo tanto, mi tarea de publicación en el gradle se ve así.Por lo tanto, utilicé otra
mavenJava
tarea para publicar el.pom
archivo en mi repositorio de maven privado para que cuando elaar
archivo se agregue como una dependencia a algún otro módulo, obtenga la.pom
información y descargue la dependencia transitiva.Para completar la respuesta, así es como debe agregar la dependencia en el
build.gradle
archivo para su propia publicaciónaar
que me importó.fuente
transitive
significa 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 = true
Cuando lo usas
@artifact notation
tienetransitive = false
fuente
Para mí, la solución de publicación completa se ve así:
El
transitive = true
bloque también es necesario ...fuente
Simplemente agregando @aar al final de la dependencia es lo que funcionó para mí.
fuente