我写了一个 Android 库,封装了公司上一些常用的控件,其中该库也引用了其他第三方的控件。
姑且把这个库称为Library A,然后引用了一个第三方库Gson,我想在工程Project1中引用Library A,以便提高效率。
现在我把Library A打包成一个 AAR ,然后复制到工程Project1中,然后调用Library A里面的方法。编译没有问题,但是一运行,就会报一个 ClassNotFoundException的错误,表示找不到第三方库Gson 。
但是如果我在Project1中加多一句compile 'com.google.code.gson:gson:2.8.0
就不会崩溃了。
最开始我以为是没把Gson打包到Library A中,解包Library A的 AAR 也是没有发现Gson的 jar 。所以一开始走了弯路,想办法把Gson的 jar 打包到Library A。在网上找到一个android-fat-aar的脚本,说是可以把第三方库也打包到 AAR 中。但是,打包完却又总是报Multiple dex files define的错误。
最后在 stackoverflow 上看到一个回答,说不应该把第三方的库打包进 AAR ,这些依赖应该由 maven 来处理。
接下来就根据这个教程搭建了一个私有的 maven 仓库,并且把Library A上传到私有仓库中。
并且在Project1中用compile 'com.example:LibraryA:1.0.0'
这种形式成功引用到Library A。但是一运行还是继续报ClassNotFoundException的错误。
接着找到资料,说是要通过 pom.xml 来传递依赖。然后在找到一个build.gradle
示例,是这样写的:
忽略无关的语句
def libraryGroupId = 'com.example' def libraryArtifactId = 'LibraryA' def libraryVersion = '1.0.0' publishing { publications { aar(MavenPublication) { groupId libraryGroupId version libraryVersion artifactId libraryArtifactId artifact("$buildDir/outputs/aar/${artifactId}-release.aar") //generate POM file pom.withXml { def root = asNode() def dependenciesNode = root.appendNode('dependencies') //Iterate over the compile dependencies (we don't want the test ones), adding a <dependency> node for each configurations.compile.allDependencies.each { if (it.group != null) { def dependencyNode = dependenciesNode.appendNode('dependency') dependencyNode.appendNode('groupId', it.group) dependencyNode.appendNode('artifactId', it.name) dependencyNode.appendNode('version', it.version) dependencyNode.appendNode('scope','compile') } } } } } } artifactory { contextUrl = 'http://localserver:8081/artifactory' publish { repository { repoKey = 'libs-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 } } }
执行后在私有的 maven 仓库上,的确看到如下的 dependency
<dependency> <groupId>com.android.volley</groupId> <artifactId>volley</artifactId> <version>1.0.0</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.0</version> <scope>compile</scope> </dependency> ......省略其他依赖
但是一调用又崩溃了,又提示找不到类。
然后我看了一下Project1的依赖,发现只引用了Library A,并没有引用Library A的依赖。
com.exmaple:Library:1.0.0并没有像com.android.support:appcompat-v7:25.2.0一样列出所需的依赖。
折腾了好几天愣是没搞明白 maven 的依赖到底要怎么写。故请教一下各位,有没有朋友遇到过这样的问题?
我想要实现的效果,就是可以在新的项目中直接compile 'com.example:LibraryA:1.0.0
就可以引用我自己的库,而不用再去声明Library A所需要的依赖
谢谢:)
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.