Eu investiguei um pouco e provavelmente vi as respostas mais populares aqui relacionadas a aar e dependências transitivas, mas de alguma forma ainda não está claro para mim como fazer isso funcionar.
Assim:
Tenho uma biblioteca Android com a configuração do Gradle fornecida:
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'
}
Em seguida, estou implantando no repositório maven local com gradle install
. O arquivo POM da biblioteca implantada tem a seguinte aparência:
<?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>
E, finalmente, a configuração do gradle do meu aplicativo Android usando a biblioteca acima como uma dependência:
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'
}
E depois de implantar o aplicativo no telefone estou recebendo NoClassDefFoundError
para classes pertencentes a dependências de compilação da minha biblioteca android.
Inspecionando minhas dependências de aplicativos 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
De acordo com a árvore acima, todas as dependências transitivas não são detectadas. Onde está o problema e como deve ser feito corretamente?
gradle dependencies
do seu aplicativo?provided
palavra-chave lá? De acordo com o Xav, essas dependências não são empacotadas no APK , e eu acho que você gostaria que elas fossem empacotadas no APK.gradle dependencies
for my android lib: default - Configuração para artefatos padrão. + --- com.google.code.gson: gson: 2.2.4 + --- com.bugsense.trace: bugsense: 3.6 \ --- commons-net: commons-net: 3.3gradle dependencies
para o aplicativo , não para uma biblioteca que alguém decidiu chamar de "aplicativo".Respostas:
Resolvi meu problema configurando o
transitive
atributo para minha dependência aar:fonte
@aar
causas do Gradle para tentar obter o artefato como um arquivo .jar. Isso mata a construção.compile project(':LeafPeripheralsContract') { transitive=true }
não funcionou. Ele reclamou sobre transitivo. E eu criei umaar
e tentei adicionar transitivo a ele. Não reclamou, mas também não o incluiu no outro pacote aar.você não deve usar "@aar", se usar "@" se tornar " notação apenas de artefato ", se quiser usar "@" e quiser ter dependência transitiva, você deve adicionar "transitivo = verdadeiro"
fonte
Tente fazer isso se estiver usando aar localmente:
fonte
Eu estava tendo um problema semelhante e senti que poderia compartilhar as etapas para resolver o problema.
A ideia básica de não ser capaz de usar as dependências transitivas enquanto você está publicando as suas próprias
aar
é não ter o.pom
arquivo gerado com as dependências transitivas esperadas.Eu estava usando o
'maven-publish'
plugin para minhaaar
dependência do Android para publicá-lo em meu próprio repositório maven privado. As dependências transitivas não foram resolvidas quando meus outros projetos adicionaram minhaaar
dependência a elesbuild.gradle
. Daí o que fiz para modificar o.pom
arquivo durante a publicação do meuaar
.Uma coisa importante a notar aqui que, as dependências que você deseja que tenham o comportamento transitivo devem ser importadas usando o
api
nobuild.gradle
arquivo do seu projeto de biblioteca como a seguir.Agora, como eu disse antes, eu estava usando o
maven-publish
plugin para publicar aaar
dependência e, portanto, minha tarefa de publicação no gradle se parece com o seguinte.Portanto, usei outra
mavenJava
tarefa para publicar o.pom
arquivo em meu repositório maven privado para que, quando oaar
arquivo for adicionado como uma dependência a algum outro módulo, ele obtenha as.pom
informações e baixe a dependência transitiva.Para completar a resposta, deve adicionar no
build.gradle
arquivo a dependência do seu próprio publicadoaar
para mim importado.fonte
transitive
significa que o consumidor (por exemplo, aplicativo) inclui um produtor e todas as dependências do produtor (por exemplo, bibliotecas). Isso aumenta o tempo de construção e pode criar alguns problemas com versões de dependênciaPor padrão, a dependência do Gradle tem
transitive = true
Quando você usa
@artifact notation
temtransitive = false
fonte
Para mim, a solução de publicação completa se parece com isto:
O
transitive = true
bloqueio também é necessário ...fonte
Simplesmente adicionar @aar no final da dependência é o que funcionou para mim.
fonte