如何把 Android Library上传到JCenter仓库
由于公司需求,想把自己平常封装的一些控件或者收集的控件提交到JCenter仓库以便其他同事使用,废话不多,直接上步骤。
1. 注册bintray账号
你要想在bintray上发布自己的Library就必须有一个账号,这里建议使用github账号授权登录,这样以后你开源的仓库可以在github找到相应的源码,如果你不想使用其他登录方式的话就另外注册一个账号。( 想重新注册请自行脑补注册过程 )

登录成功之后,你会看到以下

2. 创建package



这里示例创建一个mytestutils的包,如下图所示:

关于github项目的创建 嗯 也请自行脑补
3. 创建一个Android Library
新建一个android project,然后new 一个module,选择android library,项目结构如下:

这里为了演示,创建了一个简单的类:

4. 应用bintray插件
如果想通过bintrayUpload命令上传library就必须在根gradle下引用相应的插件,配置如下:
dependencies {
classpath 'com.android.tools.build:gradle:2.2.0-beta2'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.6'
}
然后在我们的Library工程的build.gradle引用插件,如下所示:
apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'
应用成功后,你会看到插件生成的task,如下图所示:

通过这个task,我们可以将我们的library上传到maven仓库当中,不过我们还得继续完成我们的gradle配置。
5. build.gradle配置
我们需要在library工程的build.gradle配置我们的相应参数,下面是示例代码:
apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'
// 这个version是区分library版本的,因此当我们需要更新library时记得修改这个version
version = "1.0.0"
android {
compileSdkVersion 24
buildToolsVersion "24.0.0"
resourcePrefix "cherno" // 随便填
defaultConfig {
minSdkVersion 21
targetSdkVersion 24
versionCode 1
versionName version
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:24.2.0'
testCompile 'junit:junit:4.12'
}
def siteUrl = 'https://github.com/SanBeHappy/mytextlib' // 项目的主页
def gitUrl = 'https://github.com/SanBeHappy/mytextlib.git' // Git仓库的url
group = "com.cherno.mylibrary" //一般填你唯一的包名
install {
repositories.mavenInstaller {
// This generates POM.xml with proper parameters
pom {
project {
packaging 'aar'
// Add your description here
description 'my utils for test'
name 'Android Commonly used utils' //项目描述
url siteUrl
// Set your license
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
developers {
developer { // 开发者信息
id 'cherno'
name 'cherno'
email 'cherno@126.com'
}
}
scm {
connection gitUrl
developerConnection gitUrl
url siteUrl
}
}
}
}
}
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
}
task javadoc(type: Javadoc) {
options.encoding = 'UTF-8'
source = 'src/main/java'
}
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
artifacts {
archives javadocJar
archives sourcesJar
}
Properties properties = new Properties()
// 加载本地配置
properties.load(project.rootProject.file('local.properties').newDataInputStream())
bintray {
user = properties.getProperty("bintray.user")
key = properties.getProperty("bintray.apikey")
configurations = ['archives']
pkg {
repo = "maven" //发布到Bintray的那个仓库里,默认账户有四个库,我们这里上传到maven库
name = "mytestlib" //发布到Bintray上的项目名字
websiteUrl = siteUrl
vcsUrl = gitUrl
licenses = ["Apache-2.0"]
publish = true
}
}
你还需要在local.properties中定义两行代码:
bintray.user=YOUR_BINTRAY_USERNAME
bintray.apikey=YOUR_BINTRAY_API_KEY
分别是你在bintray的用户名和apikey



配置完成后,我们就可以执行bintrayUpload命令上传我们的库到bintray,可以直接执行task或者在studio里的命令行敲入以下命令:
gradlew bintrayUpload
如果上传成功,就会在bintray的网页看到你的library,例如我通过命令上传的mytestutils库:

这个时候你已经实现通过gradle脚本上传library到maven仓库,你可以在本地验证以下,需要进行在根目录的build.gradle配置:
allprojects {
repositories {
jcenter()
maven {
url 'https://dl.bintray.com/sanbehappy/maven/'
}
}
}
这样我们就可以访问上传到maven的library,在项目配置:
这里就是最坑的地方!!这里就是最坑的地方!!这里就是最坑的地方!!重要的事说三遍!!
路径最好是去library文件夹 → build文件夹 → poms文件夹 打开pom-default.xml文件 里找
路径 = groupId+artifactId+version

完全体 如下图所示 :

编译成功之后,可以在External Libraries看到我们从maven仓库下载下来的library:

但如果你想让其他开发者直接使用,需要上传到Jcenter,而不需要配置maven的地址。


完成这些操作之后,你只需等待bintray团队审核通过,之后其他开发者只需配置一行代码就可以使用了。
如需提交新版本只需修改版本号再次执行提交命令即可。
6. 错误总结
我相信绝大多数人都会遇到BUILD FAILED 的情况的。
打包过程遇到的错误大致总结一下就是:
Javadoc generation failed. Generated Javadoc options file (useful for troubleshooting): ‘路径’
- 错误: 编码GBK的不可映射字符 ——注释不要用中文,或者修改项目的字符编码
- 错误: 找不到符号——删除javadoc里所有的html标签
Could not create package ‘路径’: HTTP/1.1 401 Unauthorized [message:This resource requires authentication] - 你一定是用户名或者APIKey填错了。
在教同事实践的过程中 又得出以下报错 : could not creat HTTP 404
解决方法如下: repo的name必须与你创建maven仓库时命名的name一致

修改完错误上传成功之后,就可以方便的使用compile了。以上