Zbadałem jakiś czas i prawdopodobnie zobaczyłem tutaj najpopularniejsze odpowiedzi związane z aar i zależnościami przechodnimi, ale jakoś nadal nie jest dla mnie jasne, jak to działa.
Więc:
Mam bibliotekę androida z podaną konfiguracją gradle:
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'
}
Następnie wdrażam go do lokalnego repozytorium Maven z gradle install
. Plik POM wdrożonej biblioteki wygląda następująco:
<?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>
I wreszcie konfiguracja gradle mojej aplikacji na Androida używająca powyższej biblioteki jako zależności:
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'
}
A po wdrożeniu aplikacji na telefon dostaję się NoClassDefFoundError
na klasy należące do zależności kompilacyjnych mojej biblioteki Android.
Sprawdzanie zależności aplikacji na Androida przy użyciu 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
Zgodnie z powyższym drzewem nie są wykrywane wszystkie zależności przechodnie. Gdzie jest problem i jak należy to zrobić poprawnie?
gradle dependencies
swojej aplikacji?provided
tam umieścić słowo kluczowe? Według Xav takie zależności nie są pakowane w APK i myślę, że chciałbyś, aby były spakowane w APK.gradle dependencies
for my android lib: default - Konfiguracja domyślnych artefaktów. + --- com.google.code.gson: gson: 2.2.4 + --- com.bugsense.trace: bugsense: 3.6 \ --- commons-net: commons-net: 3.3gradle dependencies
dla aplikacji , a nie do biblioteki, że ktoś postanowił nazwać „app”.Odpowiedzi:
Rozwiązałem swój problem, ustawiając
transitive
atrybut dla mojej zależności aar:compile ('com.somepackage:LIBRARY_NAME:1.0.0@aar'){ transitive=true }
źródło
@aar
przyczyn, dla których Gradle próbuje pobrać artefakt jako plik .jar. To zabija kompilację.compile project(':LeafPeripheralsContract') { transitive=true }
nie działał. Narzekał na przechodni. Utworzyłemaar
i próbowałem dodać do niego przechodni. Nie narzekał, ale nie zawierał go również w innym pakiecie aar.nie powinieneś używać "@aar", jeśli użycie "@" zmieni się w " Notację tylko artefakt ", jeśli chcesz użyć "@" i chcesz mieć zależność przechodnią, powinieneś dodać "transitive = true"
źródło
Spróbuj tego, jeśli używasz aar lokalnie:
compile(project(:your-library-name)) { transitive=true }
źródło
Miałem podobny problem i czułem, że mogę podzielić się etapami rozwiązania problemu.
Podstawową ideą niemożności użycia zależności przechodnich podczas publikowania własnych
aar
jest w rzeczywistości brak.pom
wygenerowania pliku z oczekiwanymi zależnościami przechodnimi.I był przy użyciu
'maven-publish'
wtyczki dla mojego androidaar
uzależnienia, aby opublikować go w moim własnym prywatnym repozytorium maven. Zależności przechodnie nie zostały rozwiązane, gdy moje inne projekty dodawały mojąaar
zależność do swoich plikówbuild.gradle
. Stąd tutaj, co zrobiłem, aby zmodyfikować.pom
plik podczas publikowania mojegoaar
.Należy tutaj zauważyć, że zależności, które mają być zachowane jako przechodnie, powinny być importowane przy użyciu pliku
api
projektu biblioteki,build.gradle
jak poniżej.dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) api 'com.android.volley:volley:1.0.0' api "com.google.code.gson:gson:$globalGsonVersion" }
Teraz, jak powiedziałem wcześniej, używałem
maven-publish
wtyczki do publikowaniaaar
zależności i stąd moje zadanie publikowania w gradle wygląda następująco.publishing { publications { mavenAar(MavenPublication) { from components.android } mavenJava(MavenPublication) { pom.withXml { def dependenciesNode = asNode().appendNode('dependencies') // Iterate over the api dependencies (we don't want the test ones), adding a <dependency> node for each configurations.api.allDependencies.each { def dependencyNode = dependenciesNode.appendNode('dependency') dependencyNode.appendNode('groupId', it.group) dependencyNode.appendNode('artifactId', it.name) dependencyNode.appendNode('version', it.version) } } } } repositories { maven { // Your repository information goes here } } }
W związku z tym użyłem innego
mavenJava
zadania, aby opublikować.pom
plik w moim prywatnym repozytorium maven, aby poaar
dodaniu pliku jako zależności do innego modułu.pom
pobierał informacje i pobierał zależność przechodnią.Aby uzupełnić odpowiedź, w ten sposób należy dodać zależność w
build.gradle
pliku do własnegoaar
zaimportowanego do mnie opublikowanego .api('com.example.masudias:my_lib:1.0.0@aar') { transitive = true }
źródło
transitive
oznacza, że konsument (np. aplikacja) obejmuje producenta i wszystkie zależności producenta (np. biblioteki). Wydłuża czas kompilacji i może powodować problemy z wersjami zależnościDomyślnie zależność Gradle ma
transitive = true
api ('com.package:library:0.0.1') //the same api ('com.package:library:0.0.1') { transitive = true }
Kiedy używasz
@artifact notation
, matransitive = false
api ('com.package:library:0.0.1@aar') //the same api ('com.package:library:0.0.1@aar') { transitive = false }
źródło
Dla mnie kompletne rozwiązanie do publikowania wygląda następująco:
apply plugin: 'com.github.dcendents.android-maven' group = GROUP version = VERSION // you could move it to env variable or property def publishFlavorless = true def firstTask = null android.libraryVariants.all { variant -> if (variant.name.toLowerCase().contains("debug")) { // Workaround for https://github.com/gradle/gradle/issues/1487 if (publishFlavorless && firstTask == null) { def bundleTask = tasks["bundle${variant.name.capitalize()}Aar"] firstTask = bundleTask artifacts { archives(firstTask.archivePath) { builtBy firstTask name = project.name } } } return } def bundleTask = tasks["bundle${variant.name.capitalize()}Aar"] artifacts { archives(bundleTask.archivePath) { classifier variant.flavorName builtBy bundleTask name = project.name } } } install { repositories.mavenInstaller { // This generates POM.xml with proper parameters pom.project { name POM_NAME artifactId POM_ARTIFACT_ID // For aar it is equal to 'aar' with jar transitive dependencies won't work packaging POM_PACKAGING description POM_DESCRIPTION } } }
transitive = true
Blok jest wymagane, jak również ...źródło
Po prostu dodanie @aar na końcu zależności zadziałało dla mnie.
dependencies { implementation 'org.videolan.vlc:libvlc:3.0.13@aar' }
źródło