Reputation: 141
I'm developing a library for Android for internal use in our company, this library has third part dependencies and is stored in our own Artifactory repository.
The problem is that since we upgraded to Gradle 3 we don't have visibility of the dependencies of the library in the different projects in which we use the library.
Am I missing something, that's my build.gradle file of the library:
apply plugin: 'com.android.library'
//Skitude Plugins
apply plugin: 'com.jfrog.artifactory'
apply plugin: 'maven-publish'
repositories {
maven { url "https://jitpack.io" }
mavenCentral()
}
//Artifactory ID
def libraryGroupId = 'com.company.companylibrary'
def libraryArtifactId = 'library'
def libraryVersion = '0.0.6'
android {
compileSdkVersion 27
defaultConfig {
minSdkVersion 17
targetSdkVersion 27
versionCode 6
versionName "0.0.6"
vectorDrawables.useSupportLibrary= true
}
buildTypes {
defaultConfig {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
//Dependencies ANDROID
api 'com.android.support:appcompat-v7:27.1.1'
api 'com.android.support:support-v13:27.1.1'
api 'com.android.support:support-annotations:27.1.1'
api 'com.android.support:support-vector-drawable:27.1.1'
api 'com.android.support.constraint:constraint-layout:1.1.0'
api 'com.android.support:design:27.1.1'
api 'com.android.support:cardview-v7:27.1.1'
api 'com.android.support:recyclerview-v7:27.1.1'
api 'com.android.support:customtabs:27.1.1'
api 'com.android.volley:volley:1.0.0'
...
}
publishing {
publications {
aar(MavenPublication) {
groupId libraryGroupId
version libraryVersion
artifactId libraryArtifactId
artifact("$buildDir/outputs/aar/${artifactId}-release.aar")
pom.withXml {
def dependencies = asNode().appendNode('dependencies')
configurations.compile.allDependencies.each {
def dependency = dependencies.appendNode('dependency')
dependency.appendNode('groupId', it.moduleGroup)
dependency.appendNode('artifactId', it.moduleName)
dependency.appendNode('version', it.moduleVersion)
}
}
}
}
}
artifactory {
contextUrl = 'http://artifactory.company.com/artifactory/'
publish {
repository {
repoKey = 'library-core-release-local'
username = artifactory_username
password = artifactory_password
}
defaults {
publications('aar')
publishArtifacts = true
properties = ['qa.level': 'basic', 'q.os': 'android', 'dev.team': 'core']
publishPom = true
}
}
}
For example when my library want to access volley library from my app without importing the dependecy again, so it's already imported in my library I get this:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.skitude.Valdesqui, PID: 28489
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/android/volley/toolbox/DiskBasedCache;
at com.blabsolutions.skitudelibrary.Helpers.ProfileHelper.setupVolley(ProfileHelper.java:81)
at com.blabsolutions.skitudelibrary.SkitudeApplication.onCreate(SkitudeApplication.java:132)
at com.skitude.Valdesqui.CoorpApplication.onCreate(CoorpApplication.java:32)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1032)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5885)
at android.app.ActivityThread.-wrap3(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1703)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6692)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.android.volley.toolbox.DiskBasedCache" on path: DexPathList[[zip file "/data/app/com.skitude.Valdesqui-1/base.apk", zip file "/data/app/com.skitude.Valdesqui-1/split_lib_dependencies_apk.apk", zip file "/data/app/com.skitude.Valdesqui-1/split_lib_slice_0_apk.apk", zip file "/data/app/com.skitude.Valdesqui-1/split_lib_slice_1_apk.apk", zip file "/data/app/com.skitude.Valdesqui-1/split_lib_slice_2_apk.apk", zip file "/data/app/com.skitude.Valdesqui-1/split_lib_slice_3_apk.apk", zip file "/data/app/com.skitude.Valdesqui-1/split_lib_slice_4_apk.apk", zip file "/data/app/com.skitude.Valdesqui-1/split_lib_slice_5_apk.apk", zip file "/data/app/com.skitude.Valdesqui-1/split_lib_slice_6_apk.apk", zip file "/data/app/com.skitude.Valdesqui-1/split_lib_slice_7_apk.apk", zip file "/data/app/com.skitude.Valdesqui-1/split_lib_slice_8_apk.apk", zip file "/data/app/com.skitude.Valdesqui-1/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.skitude.Valdesqui-1/lib/arm64, /system/lib64, /vendor/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at com.blabsolutions.skitudelibrary.Helpers.ProfileHelper.setupVolley(ProfileHelper.java:81)
at com.blabsolutions.skitudelibrary.SkitudeApplication.onCreate(SkitudeApplication.java:132)
at com.skitude.Valdesqui.CoorpApplication.onCreate(CoorpApplication.java:32)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1032)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5885)
at android.app.ActivityThread.-wrap3(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1703)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6692)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)
Suppressed: java.io.IOException: No original dex files found for dex location (arm64) /data/app/com.skitude.Valdesqui-1/split_lib_slice_6_apk.apk ()
at dalvik.system.DexFile.openDexFileNative(Native Method)
at dalvik.system.DexFile.openDexFile(DexFile.java:373)
at dalvik.system.DexFile.<init>(DexFile.java:113)
at dalvik.system.DexFile.<init>(DexFile.java:78)
at dalvik.system.DexPathList.loadDexFile(DexPathList.java:359)
at dalvik.system.DexPathList.makeElements(DexPathList.java:323)
at dalvik.system.DexPathList.makeDexElements(DexPathList.java:263)
at dalvik.system.DexPathList.<init>(DexPathList.java:126)
at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:48)
at dalvik.system.PathClassLoader.<init>(PathClassLoader.java:64)
at com.android.internal.os.PathClassLoaderFactory.createClassLoader(PathClassLoaderFactory.java:43)
at android.app.ApplicationLoaders.getClassLoader(ApplicationLoaders.java:58)
at android.app.LoadedApk.createOrUpdateClassLoaderLocked(LoadedApk.java:535)
at android.app.LoadedApk.getClassLoader(LoadedApk.java:568)
at android.app.ActivityThread.getTopLevelResources(ActivityThread.java:2046)
at android.app.LoadedApk.getResources(LoadedApk.java:787)
at android.app.ContextImpl.<init>(ContextImpl.java:2261)
at android.app.ContextImpl.createAppContext(ContextImpl.java:2201)
at android.app.ContextImpl.createAppContext(ContextImpl.java:2192)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5776)
... 8 more
Things that I tried:
Thanks
Upvotes: 4
Views: 836
Reputation: 748
After upgrading to gradle 3+, you switch your compile's to implementation/api in your gradle as you know. However, you have left the line 'compile' for you pom.xml dependency creation. You should change the line;
pom.withXml {
def dependencies = asNode().appendNode('dependencies')
configurations.compile.allDependencies.each {
def dependency = dependencies.appendNode('dependency')
dependency.appendNode('groupId', it.moduleGroup)
dependency.appendNode('artifactId', it.moduleName)
dependency.appendNode('version', it.moduleVersion)
}
}
with;
pom.withXml {
def dependencies = asNode().appendNode('dependencies')
configurations.implementation.allDependencies.each {
def dependency = dependencies.appendNode('dependency')
dependency.appendNode('groupId', it.group)
dependency.appendNode('artifactId', it.name)
dependency.appendNode('version', it.version)
}
}
Upvotes: 3
Reputation: 12705
You may want to look at other similar SO threads, like:
Especially the second seems to have a more thorough answer which involves modifying both the library project and the client project (the one using the library)
Upvotes: 0