Ich habe eine Weile nachgeforscht und hier wahrscheinlich die beliebtesten Antworten in Bezug auf aar und transitive Abhängigkeiten gesehen, aber irgendwie ist mir immer noch nicht klar, wie ich das zum Laufen bringen soll.
So:
Ich habe eine Android-Bibliothek mit der angegebenen Gradle-Konfiguration:
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'
}
Dann stelle ich es für ein lokales Maven-Repo bereit gradle install
. Die POM-Datei der bereitgestellten Bibliothek sieht folgendermaßen aus:
<?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>
Und schließlich gradle Konfiguration meiner Android-Anwendung unter Verwendung der obigen Bibliothek als Abhängigkeit:
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'
}
Und nachdem ich die Anwendung auf dem Telefon NoClassDefFoundError
bereitgestellt habe, erhalte ich Klassen, die zum Kompilieren von Abhängigkeiten meiner Android-Bibliothek gehören.
Überprüfen meiner Android-Anwendungsabhängigkeiten mit 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
Gemäß dem obigen Baum werden nicht alle transitiven Abhängigkeiten erkannt. Wo liegt das Problem und wie soll es richtig gemacht werden?
gradle dependencies
für Ihre App untersucht?provided
Schlüsselwort dort haben möchten ? Laut Xav sind solche Abhängigkeiten nicht in der APK gepackt, und ich würde denken, dass Sie möchten, dass diese in der APK gepackt werden.gradle dependencies
für meine Android- Bibliothek : Standard - Konfiguration für Standardartefakte. + --- com.google.code.gson: gson: 2.2.4 + --- com.bugsense.trace: bugsense: 3.6 \ --- commons-net: commons-net: 3.3gradle dependencies
für die App zu laufen , nicht für eine Bibliothek, die jemand als "App" bezeichnete.Antworten:
Ich habe mein Problem gelöst, indem ich ein
transitive
Attribut für meine aar-Abhängigkeit festgelegt habe:quelle
@aar
Ursachen weggelassen werden, versucht Gradle, das Artefakt als JAR-Datei abzurufen. Dies tötet den Build.compile project(':LeafPeripheralsContract') { transitive=true }
funktioniert nicht. Es beschwerte sich über transitiv. Und ich habe ein erstelltaar
und versucht, es transitiv hinzuzufügen. Es hat sich nicht beschwert, aber es hat es auch nicht in das andere aar-Paket aufgenommen.Sie sollten "@aar" nicht verwenden. Wenn "@" zu " Nur Artefakt-Notation " wird. Wenn Sie "@" verwenden und eine Abhängigkeit transitiv haben möchten, sollten Sie "transitiv = wahr" hinzufügen.
quelle
Versuchen Sie dies, wenn Sie aar lokal verwenden:
quelle
Ich hatte ein ähnliches Problem und hatte das Gefühl, die Schritte zur Lösung des Problems teilen zu können.
Die Grundidee, die transitiven Abhängigkeiten nicht verwenden zu können, während Sie Ihre eigenen veröffentlichen,
aar
besteht darin, dass die.pom
Datei nicht mit den erwarteten transitiven Abhängigkeiten generiert wird.Ich habe das
'maven-publish'
Plugin für meine Android-aar
Abhängigkeit verwendet, um es in meinem eigenen privaten Maven-Repository zu veröffentlichen. Die transitiven Abhängigkeiten wurden nicht aufgelöst, als meine anderen Projekte meineaar
Abhängigkeit in ihre hinzufügtenbuild.gradle
. Daher hier, was ich getan habe, um die.pom
Datei beim Veröffentlichen meiner zu ändernaar
.Hierbei ist zu beachten, dass die Abhängigkeiten, für die Sie das transitive Verhalten wünschen, wie folgt
api
in diebuild.gradle
Datei Ihres Bibliotheksprojekts importiert werden sollten .Wie ich bereits sagte, habe ich das
maven-publish
Plugin verwendet, um dieaar
Abhängigkeit zu veröffentlichen, und daher sieht meine Veröffentlichungsaufgabe im Gradle wie folgt aus.Daher habe ich eine andere
mavenJava
Aufgabe verwendet, um die.pom
Datei in meinem privaten Maven-Repo zu veröffentlichen, sodass beim Hinzufügen deraar
Datei als Abhängigkeit zu einem anderen Modul die.pom
Informationen abgerufen und die transitive Abhängigkeit heruntergeladen werden.Um die Antwort zu vervollständigen, sollten Sie auf diese Weise die Abhängigkeit in der
build.gradle
Datei für Ihre eigeneaar
, mir importierte Datei hinzufügen .quelle
transitive
bedeutet, dass der Verbraucher (z. B. App) einen Produzenten und alle Abhängigkeiten des Produzenten (z. B. Bibliotheken) enthält. Dies verlängert die Erstellungszeit und kann zu Problemen mit Abhängigkeitsversionen führenStandardmäßig hat Gradle-Abhängigkeit
transitive = true
Wenn Sie es verwenden
@artifact notation
, hattransitive = false
quelle
Für mich sieht die komplette Publishing-Lösung folgendermaßen aus:
Der
transitive = true
Block wird auch benötigt ...quelle
Das einfache Hinzufügen von @aar am Ende der Abhängigkeit hat bei mir funktioniert.
quelle