首页 文章

Android:使用具有gradle依赖项的库项目时ClassNotFoundException

提问于
浏览
8

我有一个自定义视图库,可以自己编译和运行(通过在库项目中为测试目的而创建的另一个活动) . 然而,当我构建库,然后将aar导入另一个项目(打开模块设置 - >新模块 - >现有的aar ..)我得到一个运行时ClassNotFoundException - 异常是关于库的唯一gradle依赖项使用 . 为什么会这样?

库gradle文件:

apply plugin: 'com.android.library'

    android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
dependencies {
    compile 'com.googlecode.libphonenumber:libphonenumber:7.2.1'
}

我得到的错误:

Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.i18n.phonenumbers.PhoneNumberUtil" on path: DexPathList[[zip file..

1 回答

  • 0

    aar依赖不像maven / ivy依赖,因为在pom或xml文件中没有与它捆绑的传递依赖 . 当您添加aar依赖项时,gradle无法知道要获取的传递依赖项 .

    Android世界中的常见做法似乎是,使用aar明确地向您的应用添加传递依赖 . 这可能会变得很麻烦,并且会使依赖管理系统失败 .

    有几种解决方法:

    1. android-maven插件

    有一个3rd party gradle plugin允许您将aar文件与有效的pom文件一起发布到本地maven存储库 .

    2. maven-publish插件

    您使用标准maven-publish plugin将aar发布到maven repo,但您必须自己组装pom依赖项 . 例如:

    publications {
        maven(MavenPublication) {
            groupId 'com.example' //You can either define these here or get them from project conf elsewhere
            artifactId 'example'
            version '0.0.1-SNAPSHOT'
            artifact "$buildDir/outputs/aar/app-release.aar" //aar artifact you want to publish
    
            //generate pom nodes for dependencies
            pom.withXml {
                def dependenciesNode = asNode().appendNode('dependencies')
                configurations.compile.allDependencies.each { dependency ->
                    def dependencyNode = dependenciesNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId', dependency.group)
                    dependencyNode.appendNode('artifactId', dependency.name)
                    dependencyNode.appendNode('version', dependency.version)
                }
            }
        }
    }
    

    在这两种情况下,一旦maven repo中有aar pom,你可以在你的应用程序中使用它,如下所示:

    compile ('com.example:example:0.0.1-SNAPSHOT@aar'){transitive=true}
    

    (如果您将依赖项添加为 compile project(:mylib) ,我不完全确定传递如何工作 . 我将很快更新此案例的答案)

相关问题