簡體   English   中英

Android:使用具有gradle依賴項的庫項目時,ClassNotFoundException

[英]Android: ClassNotFoundException when using library project that has gradle dependencies

我有一個自定義視圖庫,它可以自行編譯並正確運行(通過在庫項目內部創建的另一個僅用於測試目的的活動)。 但是,當我構建庫,然后將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..

aar依賴項與maven / ivy依賴項不同,因為pom或xml文件中沒有捆綁有傳遞性依賴項。 添加aar依賴項時,gradle無法知道要獲取哪些傳遞性依賴項。

在android世界中,一種常見做法是使用aar將傳遞依賴項顯式添加到您的應用中。 這會變得很麻煩,並且會破壞依賴管理系統的意義。

有兩種解決方法:

1. android-maven插件

有一個3rd party gradle插件 ,可讓您將aar文件以及有效的pom文件發布到本地maven存儲庫中。

2. maven-發布插件

您可以使用標准的maven-publish插件將aar發布到maven存儲庫,但是您必須自己組裝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倉庫中可以使用aar + pom,您就可以像這樣在應用程序中使用它:

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

(如果您將依賴項添加為compile project(:mylib)我不能完全確定傳遞compile project(:mylib) 。我將在不久的情況下更新此答案)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM