将Library Module上传Jcenter的文章,网上一搜一大堆,主要分为两类,一类是正常的流程,使用gradle上传到Jcenter,还有一种较为简便,是将上传的方法封装成一个gradle插件,你直接依赖,设置,调用方法即可。在写这篇文章之前,我特意将两种方法都做了测试,我个人还是感觉用原生的方法较好,一是能了解上传流程,其次,遇到坑了也知道该怎么找问题。
在开始之前,需要说明由于上传依赖的都是gradle,希望开发者能有一些基本的gradle语法常识,所以这里推荐我之前写的两篇文章:
Android工程gradle详解
Groovy基础
账号注册
首先肯定是需要去官网注册一个账号:
这一步就不多说了
准备
账号有了,你要想上传Module,至少你要有一个Module,你可以新建,也可以使用现有已经写好的。但是要注意,要上传的Module,必须要是Library Module,有人可能问,这有啥区别?
区别在这里:
defaultConfig {
minSdkVersion 9
targetSdkVersion 24
versionCode 1
versionName "1.0"
}
Library Module没有applicationId,App Module有applicationId,也就是你的包名。
根目录中的配置:
注意这里说的是根目录,也就是Project的build.gradle:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.2'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'//2.1.2对应1.3
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.6'
classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.0.0" //
}
}
需要注意如果用的2.1.2的gradle使用的上传插件是1.3,如果别的版本,可能需要修改版本,否则编译会报错。
正常来说,根目录的配置就完成了。如果你的Project下的Module有多个要上传,建议将配置的基本资料放在这里:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.2'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'//2.1.2对应1.3
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.6'
classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.0.0" //
}
}
allprojects {
repositories {
jcenter()
}
}
ext {
siteUrl = 'https://github.com/xxx/xxxx'
gitUrl = 'https://github.com/xxxx/xxxx.git'
group = "com.xxx.xxxx"
version = "1.4"
id = 'xxx'
name = 'xxx'
email = xxxx@vip.qq.com'
packaging = 'aar'
}
task clean(type: Delete) {
delete rootProject.buildDir
}
看到上面代码中ext部分就是需要自己根据自己工程信息填写的部分。
好了,这里的配置就完成了
用户名和API �KEY
这两个信息我们需要写在local.properties中,当然,你可能会问为什么非要写在这个文件中,不能写在刚才的ext中吗?
可以,但是这两个信息涉及保密的东西,一般不对外,你将代码上传到github上,build.gradle文件是暴露的,但是local.properties是不暴露的。
首先需要先登录到Jcenter官网->Edit Profile->API Key:
然后打开local.properties放入,这个文件里面应该还有你的android sdk或ndk的路径配置:
sdk.dir=/Users/xxxx/Library/Android/sdk
BINTRAY_USER=xxxx
BINTRAY_KEY=xxxxxxx
上传
接下来就是重头戏了,上传的代码。这些代码需要写在你要上传的Module的build.gradle中,你可以就写在dependencies
�的底下。
首先需要引入两个插件(为了让看官们,理解应该写在哪,我在上面加入了dependencies部分,这个与上传无关):
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'
接下来是定义写基本信息:
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'
def libname = 'sina_full'//项目的名字 这个与之后生成的路径无关,单纯是在网站上的显示
def libdesc = '新浪完整版' //项目的名字 这个与之后生成的路径无关,单纯是在网站上的显示
version = rootProject.ext.version//版本号,这个我们写在ext中了,没看到的朋友,往前看
group = rootProject.ext.group//这个就是路径名的group了
这里要特别注意group就是上传成功之后,依赖的group,具体可以参照下图:
然后就是声称对应的jar和javadoc(以下代码可以直接拷贝,前提是在Project的gradle中配置了ext):
//生成源文件
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
}
//生成文档
task javadoc(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
options.encoding "UTF-8"
options.charSet 'UTF-8'
options.author true
options.version true
failOnError false
}
//文档打包成jar
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
//拷贝javadoc文件
task copyDoc(type: Copy) {
from "${buildDir}/docs/"
into "docs"
}
//上传到jcenter所需要的源码文件
artifacts {
archives javadocJar
archives sourcesJar
}
// 配置maven库,生成POM.xml文件
install {
repositories.mavenInstaller {
// This generates POM.xml with proper parameters
pom {
project {
packaging rootProject.ext.packaging
name libname
url siteUrl
licenses {
license {
name libname
url rootProject.ext.siteUrl
}
}
developers {
developer {
id rootProject.ext.id
name rootProject.ext.name
email rootProject.ext.email
}
}
scm {
connection rootProject.ext.gitUrl
developerConnection rootProject.ext.gitUrl
url rootProject.ext.siteUrl
}
}
}
}
}
以上代码就是生成上传所需要的东西,接着就是上传了:
Properties properties = new Properties()//先要读取local.properties中的name和key
properties.load(project.rootProject.file('local.properties').newDataInputStream())
bintray {
user = properties.getProperty("BINTRAY_USER") //读取 local.properties 文件里面的 bintray.user
key = properties.getProperty("BINTRAY_KEY") //读取 local.properties 文件里面的 bintray.apikey
configurations = ['archives']
pkg {
repo = "maven"
name = libname //发布到JCenter上的项目名字,必须填写
desc = libdesc //项目描述
websiteUrl = rootProject.ext.siteUrl
vcsUrl = rootProject.ext.gitUrl
licenses = ["Apache-2.0"]
publish = true
}
}
至此,一切配置都完成了,可以运行了。
运行
运行分成两步:
- 生成POM文件
Windows:gradlew install
Mac:gradle install
- 上传你的Library库到jcenter的maven库
Windows:gradlew bintrayUpload
Mac:gradle bintrayUpload
上传完成
上传完成之后并不能真的使用。
登录jcenter首页->点击下方maven即可进入到你上传的maven库列表界面
在maven库列表界面找你你刚才上传的maven库点进去即可看到相关的项目详情:
点开你上传的项目,找到Add to JCenter 按钮,点击:
然后会跳转到提交描述内容界面:
点击提交即可。
一般没有问题的话,第二天即可使用。
上传遇到的坑
在这里,我会总结一下上传的时候可能遇到的坑,以下内容不一定是我遇到的,有部分摘自网络,方便大家查看:
- 编码GBK的不可映射字符
解决:
task javadoc(type: Javadoc) {
options.encoding "UTF-8"
options.charSet 'UTF-8'
}
- gradle 权限不足,或找不到gradle
解决:先source一下,或者检查环境变量 - Lint found errors in the project; aborting build.
解决:第一,根据提示修改代码中不规范的地方,第二,去掉lint
android {
lintOptions {
abortOnError false
}
}
- Javadoc generation failed. Generated Javadoc options file
解决:第一,正常加入javadoc生成,第二,去掉javadoc检查:
allprojects {
repositories {
jcenter()
}
tasks.withType(Javadoc) {
options.addStringOption('Xdoclint:none', '-quiet')
options.addStringOption('encoding', 'UTF-8')
}
}
- Could not create version ‘0.1’: HTTP/1.1 401 Unauthorized [message:This resource requires authentication]
解决:没有配置正确的API Key - 如何升级
解决:如果你是跟着我的教程走的,只需要修改ext中的version版本号即可。
最后还是推荐一下我的公众号,欢迎给我留言。
更多的开发知识,可以关注我的公众号:
网友评论