Saya telah menyelidiki beberapa saat dan mungkin melihat jawaban paling populer di sini terkait dengan aar dan dependensi transitif tetapi entah bagaimana masih belum jelas bagi saya bagaimana membuatnya berfungsi.
Begitu:
Saya memiliki perpustakaan android dengan konfigurasi gradle yang diberikan:
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'
}
Kemudian saya menerapkannya ke repo maven lokal dengan gradle install
. File POM dari pustaka yang diterapkan terlihat seperti ini:
<?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>
Dan akhirnya konfigurasi gradle aplikasi android saya menggunakan pustaka di atas sebagai dependensi:
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'
}
Dan setelah menerapkan aplikasi di ponsel, saya mendapatkan NoClassDefFoundError
kelas yang termasuk dalam dependensi kompilasi pustaka android saya.
Memeriksa dependensi aplikasi android saya menggunakan 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
Menurut pohon di atas, semua dependensi transitif tidak terdeteksi. Di mana masalahnya dan bagaimana cara melakukannya dengan benar?
gradle dependencies
aplikasi Anda?provided
kata kunci di sana? Menurut Xav, dependensi semacam itu tidak dikemas dalam APK , dan menurut saya Anda ingin agar dependensi tersebut dikemas dalam APK.gradle dependencies
untuk lib android saya: default - Konfigurasi untuk artefak default. + --- com.google.code.gson: gson: 2.2.4 + --- com.bugsense.trace: bugsense: 3.6 \ --- commons-net: commons-net: 3.3gradle dependencies
untuk aplikasi , bukan untuk perpustakaan bahwa seseorang memutuskan untuk nama "aplikasi".Jawaban:
Saya telah memecahkan masalah saya dengan mengatur
transitive
atribut untuk ketergantungan aar saya:compile ('com.somepackage:LIBRARY_NAME:1.0.0@aar'){ transitive=true }
sumber
@aar
penyebab Gradle mencoba mengambil artefak sebagai file .jar. Ini membunuh build.compile project(':LeafPeripheralsContract') { transitive=true }
tidak bekerja. Ini mengeluh tentang transitif. Dan saya membuataar
dan mencoba menambahkan transitif ke dalamnya. Itu tidak mengeluh tetapi tidak memasukkannya ke dalam paket aar lainnya juga.Jangan gunakan "@aar", jika menggunakan "@" menjadi " Artifact only notation ", jika ingin menggunakan "@" dan ingin memiliki ketergantungan transitif, tambahkan "transitive = true"
sumber
Coba ini jika Anda menggunakan aar secara lokal:
compile(project(:your-library-name)) { transitive=true }
sumber
Saya mengalami masalah serupa dan merasa saya dapat membagikan langkah-langkah pemecahan masalah tersebut.
Ide dasar untuk tidak dapat menggunakan dependensi transitif saat Anda memublikasikan dependensi Anda sendiri
aar
sebenarnya tidak memiliki.pom
file yang dihasilkan dengan dependensi transitif yang diharapkan.Saya menggunakan
'maven-publish'
plugin untukaar
ketergantungan android saya untuk menerbitkannya di repositori maven pribadi saya. Dependensi transitif tidak terselesaikan ketika proyek saya yang lain menambahkanaar
ketergantungan saya ke dalamnyabuild.gradle
. Karenanya di sini apa yang saya lakukan untuk memodifikasi.pom
file saat menerbitkan fileaar
.Satu hal penting untuk diperhatikan di sini bahwa, dependensi yang Anda inginkan untuk memiliki perilaku transitif harus diimpor menggunakan file
api
proyek perpustakaan Andabuild.gradle
seperti berikut.dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) api 'com.android.volley:volley:1.0.0' api "com.google.code.gson:gson:$globalGsonVersion" }
Sekarang seperti yang saya katakan sebelumnya, saya menggunakan
maven-publish
plugin untuk mempublikasikanaar
ketergantungan dan karenanya tugas penerbitan saya di gradle terlihat seperti berikut.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 } } }
Oleh karena itu, saya menggunakan
mavenJava
tugas lain untuk menerbitkan.pom
file di repo maven pribadi saya sehingga ketikaaar
file ditambahkan sebagai ketergantungan ke beberapa modul lain, ia mendapatkan.pom
informasi dan mengunduh ketergantungan transitif.Untuk melengkapi jawabannya, ini adalah bagaimana Anda harus menambahkan ketergantungan di
build.gradle
file untuk Anda sendiri yang diterbitkanaar
untuk saya impor.api('com.example.masudias:my_lib:1.0.0@aar') { transitive = true }
sumber
transitive
berarti bahwa konsumen (misalnya aplikasi) termasuk produsen dan semua ketergantungan produsen (misalnya perpustakaan). Ini meningkatkan waktu pembuatan dan dapat membuat beberapa masalah dengan versi ketergantunganSecara default, dependensi Gradle memiliki
transitive = true
api ('com.package:library:0.0.1') //the same api ('com.package:library:0.0.1') { transitive = true }
Saat Anda menggunakannya
@artifact notation
memilikitransitive = false
api ('com.package:library:0.0.1@aar') //the same api ('com.package:library:0.0.1@aar') { transitive = false }
sumber
Bagi saya, solusi penerbitan lengkap terlihat seperti ini:
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 } } }
The
transitive = true
blok diperlukan juga ...sumber
Cukup menambahkan @aar di akhir dependensi yang berhasil bagi saya.
dependencies { implementation 'org.videolan.vlc:libvlc:3.0.13@aar' }
sumber