Transitive dependencies not resolved for aar library using gradle
Solution 1
I have solved my problem by setting transitive
attribute for my aar dependency:
compile ('com.somepackage:LIBRARY_NAME:1.0.0@aar'){
transitive=true
}
Solution 2
you should not use "@aar", if use "@" is become "Artifact only notation", if you want to use "@" and want have dependence transitive, you should add "transitive=true"
Solution 3
Try this if you are using aar locally:
compile(project(:your-library-name)) {
transitive=true
}
Solution 4
I was having a similar problem and felt I could share the steps of solving the problem.
The basic idea of not being able to use the transitive dependencies while you are publishing your own aar
is actually not having the .pom
file generated with the expected transitive dependencies.
I was using 'maven-publish'
plugin for my android aar
dependency to publish it in my own private maven repository. The transitive dependencies were not resolved when my other projects were adding my aar
dependency in their build.gradle
. Hence here what I did to modify the .pom
file while publishing my aar
.
An important thing to note here that, the dependencies which you want to have the transitive behavior should be imported using the api
in your library project's build.gradle
file like the following.
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
api 'com.android.volley:volley:1.0.0'
api "com.google.code.gson:gson:$globalGsonVersion"
}
Now as I said earlier, I was using maven-publish
plugin to publish the aar
dependency and hence my publishing task in the gradle looks like the following.
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
}
}
}
Hence, I used another mavenJava
task to publish the .pom
file in my private maven repo so that when the aar
file is added as a dependency to some other module, it gets the .pom
information and download the transitive dependency.
To complete the answer, this is how you should add the dependency in the build.gradle
file for your own published aar
to me imported.
api('com.example.masudias:my_lib:1.0.0@aar') {
transitive = true
}
Solution 5
Transitive dependency
transitive
means that the consumer(e.g. app) includes a producer and all producer's dependencies(e.g. libraries). It increase build time and can create some issues with dependency versions
By default, Gradle dependency has transitive = true
api ('com.package:library:0.0.1')
//the same
api ('com.package:library:0.0.1') {
transitive = true
}
When you use @artifact notation
it has transitive = false
api ('com.package:library:0.0.1@aar')
//the same
api ('com.package:library:0.0.1@aar') {
transitive = false
}
Comments
-
mkorszun about 3 years
I have investigated a while and probably saw most popular answers here related to aar and transitive dependencies but somehow it is still not clear for me how to make this working.
So:
I have android library with given gradle config:
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' }
Then I am deploying it to local maven repo with
gradle install
. POM file of the deployed library looks like this:<?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>
And finally gradle config of my android application using above library as a dependency:
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' }
And after deploying application on phone I am getting
NoClassDefFoundError
for classes belonging to compile dependencies of my android library.Inspecting my android application dependencies using
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
According to above tree, all transitive dependencies are not detected. Where is the problem and how should it be done correctly?
-
cwc over 9 years@PeterNiederwieser Omitting the
@aar
causes Gradle to attempt to grab the artifact as a .jar file. This kills the build. -
tasomaniac over 9 yearsIt did not worked for me. I have the exact problem. I have 2 libraries and one of them is using the other.
compile project(':LeafPeripheralsContract') { transitive=true }
did not work. It complained about transitive. And I created anaar
and tried to add transitive to it. It did not complain but it did not include it in the other aar package as well. -
lostintranslation over 9 yearsDid not work for me either. I have a classifier in the dependency as well. Wondering if that is the problem. Using Android Studio RC1 with gradle build tools 0.14.4.
-
lostintranslation over 9 yearsYup, if you are using classifiers, doesn't seem like transitive deps work. Look here: code.google.com/p/android/issues/…
-
Jeffrey Blattman over 8 yearsif you have both .jar and .aar artifacts, this is the only solution to use the @aar and include transitives.
-
srain almost 8 yearsThis answer is helpful. There was a typo in my previous comment and I deleted that one. Thanks for your answer, have a good day :).
-
Manish almost 8 yearsHi, its not working for me. I have created one library project which internally uses volley library. I have included aar file created using library project in my application. I am getting "Error:(8, 26) error: package com.android.volley does not exist" error. In my library project, I have included volley using compile(project(':volley')){ transitive = true }
-
Jalpesh almost 8 yearsHey Manish, Facing the same issue, did you find any solution?
-
Alejandro Rangel over 7 yearsI'm stuck with the same problem
-
FloG over 7 yearsAre you including the aar as flatDir? If so, I would refer you to the following comment: stackoverflow.com/questions/25698160/…
-
skyshine about 6 yearswhere should i place pom file in android application
-
Sergey Dryganets over 5 yearsIn case you are using flavors for your aar you need to workaround this issue as well: github.com/gradle/gradle/issues/1487
-
Micha over 3 yearsThat worked, thanks! Not sure why adding the transitive dependencies to the POM isn't default behaviour though.
-
Nikhil Kumar about 3 yearsNice one! Just to add a point here. When the dependencies are added as
api
, the scope of the dependency within the pom file iscompile
. But if the dependencies are added asimplementation
, the scope becomesruntime
in the pom file. -
Reaz Murshed about 3 yearsThank you for these addition @NikhilKumar. Appreciate it!
-
Bill Mote almost 3 years
An important thing to note here that, the dependencies which you want to have the transitive behavior should be imported using the api in your library project's build.gradle file like the following.
OMG, thank you.