使用过AndroidStudio的朋友对这样一种引用第三方开源库的方式肯定是不陌生的,我在刚开始接触AS的时候,也是觉得这种方式比以前eclipse中拷贝jar包的方式方便多了。
刚巧前两天看见鸿洋大神写的Android 快速发布开源项目到jcenter,所以本着追逐大神脚步的心态,我也按照博文中的方式去实践了下,但是在实践过程中还是遇到了一些问题的。
先介绍些简单的东西,第一点,我从一个小白的角度先说明两个概念,一个是仓库,一个是项目或者说库工程,仓库中能够有多个项目,而对于jcenter,我把它理解为一个大型的公共仓库,整个发布的流程可以看做,你去申请一个仓库,然后向仓库中投放你自己的轮子,接着你把你仓库中的轮子注册到这个大型的公共仓库中,这样别人就可以去那个大仓库中找到你的轮子了,当然你的仓库本身其实也是可以被别人访问的
所以如果你要类似于compile ‘xxxx ’这样的方式引用一个第三方的开源库,我们需要先申明一个中心仓库地址,AS中默认已经添加jcenter的中心仓库,如果要添加别的仓库地址,只需要在项目的最外层build.gradle文件,allProject下的 repositories中添加相关的地址就行,如下
allprojects {
repositories {
jcenter()
maven {
url '仓库地址'
}
}
}
接下来说下发布开源项目我所知道的两种方式,第一种自然就是刚介绍到的鸿洋大神博文中提到的,利用这种方式的确能够上传,但是如果项目中涉及到中文的话就不行了,会直接报中文编码的异常,对于这一点,我并不清楚解决方案,或许可以上github看下这个插件的高级用法和自定义用法,我主要是研究了下第二种方式gradle-bintray-plugin。
这种方式的话网上百度下,有许多介绍的文档,具体实现在这里介绍的也是非常详细了,建议先看下这里的详细介绍,那么说下我用这种方式遇到的一些问题:
1.涉及到中文时,这种方式可以可以在javaDoc任务中设置编码格式,如下:
task javadoc(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
options.encoding = 'utf-8'
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
也可以这样:
task javadoc(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
artifacts {
archives javadocJar
archives sourcesJar
}
//添加UTF-8编码否则注释可能JAVADOC文档可能生成不了
javadoc {
options {
encoding "UTF-8"
charSet 'UTF-8'
author true
version true
links "你的网址,随意"
title "标题"
}
}
这里主要看javaDoc{options{}}这里的代码即可,贴出这些代码是为了能更清晰的了解上下文环境,方便阅读。这两种方案对于中文编码的问题应该是能够完美解决的,本人亲测
2.如何声明artifactId这个字段以及重命名,如果看了刚刚贴出的网址的话,应该就比较了解了,对于compile一个开源库,必须知道三个要素,groupId,artifactId,以及versionId,类似于:compile ‘groupId:artifactId:versionId’这样的格式,这里说下artifactId要与你的module名一致,否则就会有问题,这个插件内部,貌似会将module的名字和artifactId做比较,如果不同会取module的名去你的远程仓库上创建存放路径,所以需要格外小心,一般可以用这样的方式声明
//这里面所有的变量名都不能修改,否则会引用不到
ext {
bintrayRepo = 'maven'
bintrayName = '名称'
publishedGroupId = '' //jcenter上的路径,不同版本间可以修改,不建议修改,改后不同版本间引用麻烦
libraryName = bintrayName //maven库的库名称,不能修改,修改后就会重新创建一个新的maven代码仓库
artifact = project.name //项目名称,不同版本间可以修改,不建议修改
libraryDescription = '' //版本描述
libraryVersion ='' //版本号
siteUrl = '' //网站,不重要,可直接填写github地址
gitUrl = '' //git地址,不重要,可直接填写guthub地址
developerId = '' //开发者id
developerName = '' //开发者名称
developerEmail = '' //开发者邮箱
licenseName = 'The Apache Software License, Version 2.0'
licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
allLicenses = ["Apache-2.0"]
}
这一段代码是根据我刚刚贴出的
介绍声明的,可以看到里面的artifact是通过project.name获取的,所以就避免了刚刚的问题,那么接下来的重命名也就比较简单了,直接对module重命名就可以了,在rename的时候会让你选是rename directory还是rename module,两个一起rename吧,保险点!
3.再说下如何多module引用,创建仓库,其实这个简单,因为直接在dependencies中申明你的引用就可以,gradle会自动帮你处理,我自己尝试了创建一个sonlibrary依赖另外两个fatherlibrary,这时候如果这两个fatherlibrary也是自己写的,那么可以先上传到远程仓库,接在最后在sonlibrary中申明引用,最后再把sonlibrary上传到同一个仓库就可以了
4.最坑的放到最后说,先复原下情景,我在创建了一个测试项目后,这个测试项目是一个单独的module,然后想测试下多个module引用的情况,所以在本地改了这个测试项目,添加了依赖,并且把远程仓库的版本删了,重新将这个多依赖的测试项目发布到仓库中,提示我发布成功,由于我是在原来版本的基础上修改的,所以groupId,artifactId以及versionId这三个值都没有改变,我在另一个之前已经引用过这个测试项目的工程中rebuild,但是并没有任何反应,相信说到这已经有许多朋友都知道了,缓存。。。所以如果要测试,请及时清理AS的缓存,缓存在哪里?这个百度一下androidstudio dependecies包存放路径就可以知道了,找到路径以后,简单粗暴的把对应groupId下的缓存都删了,重新rebuild下就可以了。
那么我对AndroidStudio上传jcenter的各种坑以及解决方案就记录完毕。