我有一个自定义 View 库,该 View 库可以自行编译并正确运行(通过在库项目内部创建的另一个仅用于测试目的的 Activity )。但是,当我构建库,然后将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文件中没有 bundle 有传递性依赖项。添加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)
}
}
}
}
在这两种情况下,一旦aaven + pom在Maven存储库中可用,您就可以像下面这样在您的应用程序中使用它:compile ('com.example:example:0.0.1-SNAPSHOT@aar'){transitive=true}
(我不确定如果将依赖项添加为
compile project(:mylib)
时,传递函数如何工作。在这种情况下,我将尽快更新此答案)