【问题标题】:Android: ClassNotFoundException when using library project that has gradle dependenciesAndroid:使用具有 gradle 依赖项的库项目时出现 ClassNotFoundException
【发布时间】:2016-05-02 21:30:18
【问题描述】:

我有一个自定义视图库,它可以自行编译和正确运行(通过在库项目中为测试目的而创建的另一个活动)。但是,当我构建库,然后将 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..

【问题讨论】:

  • 'somegradledependency' 是什么意思 @Jon
  • @AmitVaghela 抱歉,我自己的混淆尝试显然不能在这里使用。我在上面编辑并添加了库

标签: android gradle android-gradle-plugin classnotfoundexception android-library


【解决方案1】:

aar 依赖与 maven/ivy 依赖不同,因为它在 pom 或 xml 文件中没有绑定传递依赖。添加 aar 依赖项时,gradle 无法知道要获取哪些传递依赖项。

android 世界的一个常见做法似乎是,将传递依赖项显式添加到您的应用程序,使用 aar.这可能会变得很麻烦,并且有点违背依赖管理系统的意义。

有几种解决方法:

1。 android-maven 插件

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

2。 maven-发布插件

您可以使用标准 maven-publish plugin 将 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)
            }
        }
    }
}

在这两种情况下,一旦 aar+pom 在 maven 存储库中可用,您就可以像这样在您的应用中使用它:

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

(如果您将依赖项添加为 compile project(:mylib),我不完全确定传递是如何工作的。我将很快针对这种情况更新此答案)

【讨论】:

  • 我不明白。该依赖项位于库中,如果我按照您建议的方式更改它,它将不再编译。在我的应用程序中,相关行是: compile project(':libraryname')
  • 对不起,我误解了你的问题。所以你导入了一个 aar 但工作室添加了 compile project() ?
  • 我做了一个库项目,通过 gradle 有编译依赖。当我自己运行库项目时,它运行良好。当我将库项目导入另一个应用程序并尝试运行该应用程序时,出现运行时崩溃并出现异常。
  • 你可以试试project(':libraryname'){transitive = true} 吗?
  • 问题是 aar 没有附带描述其依赖关系的 pom 文件。因此,您的应用程序将不知道要获取哪些依赖项。我确实写了一个关于生成你自己的 pom 的答案,让我去找吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-30
  • 2014-06-20
相关资源
最近更新 更多