这段时间研究了下以前做app开发的时候并没有太过关注的JCenter仓库,在实际开发当中通常都是使用第三方开发者上传到jcenter的library,而我们使用的这些library或者plugin是怎么发布到JCenter并让我使用的? 如果我们想开发一个Library或者plugin,我们该怎么做?带着这些问题,我围绕它做了以下实践:
我会分别以两篇博客来分享一下我的实践过程,本篇是入门篇,主要是要告诉大家如何创建一个Android Library并上传到JCenter,很简单,相信你看了这篇文章之后以后想发布一个开源库给广大开发者用不再是问题。
JCenter是什么?
jcenter是一个由 bintray.com维护的Maven仓库。一般我们会这样定义使用的仓库:
repositories { jcenter() }
Maven仓库又是什么?
你可以理解为存放我们Library的文件服务器。
我们在使用一些开源库的时候,可能会看到在项目根目录下的build.gradle有如下配置:
allprojects { repositories { mavenCentral() }
}
mavenCentral又是什么?
我好乱啊,我不想说话。但你还是带着疑问去Google了,能搜索到的问题我们不问好吗?
好吧,直接说答案。mavenCentral跟jcenter一样,都是maven仓库,只是存放的地方不一样,不用猜了,它们半毛钱关系都没有,有一段时间Android的默认仓库是mavenCentral,但后来由于它对开发者不太友好,就把默认仓库换成了jcenter。
更加详细的说明,可以参考以下文章:
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0623/3097.html
你要想在bintray上发布自己的Library就必须有一个创建一个账号,这里建议直接使用github账号授权登录,这样以后你开源的仓库可以在github找到相应的源码,如果你不想公开的话就另外创建一个账号了。
登录成功之后,你就可以在bintray看到一些著名的仓库,比如我们开发者经常使用的homebrew。
ok,这个时候你创建好了package,后面就可以准备我们开发好的Library,然后上传到maven仓库,继续耐心看下面的步骤。
新建一个android project,然后new 一个module,选择android library,项目结构如下:
这里我只是为了演示,创建了一个简单的类:
如果想通过bintrayUpload命令上传library就必须引用相应的插件,配置如下:
dependencies { classpath 'com.android.tools.build:gradle:2.0.0' classpath 'com.github.dcendents:android-maven-gradle-plugin:latest.release' 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'
其中com.android.library是android的插件,表示它是一个android library。
应用成功后,你会看到插件生成的task,如下图所示:
通过这个task,我们可以将我们的library上传到maven仓库当中,现在还不行,我们还得继续完成我们的配置。
我们需要在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 19
buildToolsVersion "23.0.3"
resourcePrefix "devilwwj_"
defaultConfig {
minSdkVersion 9
targetSdkVersion 21
versionCode 1
versionName version
}
lintOptions {
abortOnError false
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
}
def siteUrl = 'https://github.com/devilWwj/Android-Tech' // 项目的主页
def gitUrl = 'https://github.com/devilWwj/Android-Tech.git' // Git仓库的url
group = "com.devilwwj.library" // Maven Group ID for the artifact,一般填你唯一的包名
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 'YOUR_ID'
name 'YOUR NAME'
email 'YOUR EMAIL'
}
}
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 = "myutils" //发布到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,具体可以在你的profile找到。
配置完成后,我们就可以执行bintrayUpload命令上传我们的库到bintray,可以直接执行task或者在命令行敲入以下命令:
gradlew bintrayUpload
如果上传成功,就会在bintray的网页看到你的library,例如我通过命令上传的myutils库:
这个时候你已经实现通过gradle脚本上传library到maven仓库,你可以在本地验证以下,需要进行在根目录的build.gradle配置:
allprojects { repositories { jcenter() maven { url 'https://dl.bintray.com/devilwwj/maven/' }
}
}
这样我们就可以访问上传到maven的library,在项目配置:
编译成功之后,可以在External Libraries看到我们从maven仓库下载下来的library:
但如果你想让其他开发者直接使用,需要上传到Jcenter,而不需要配置maven的地址。
完成这些操作之后,你只需等待bintray团队审核通过,之后其他开发者只需配置一行代码就可以使用了。
关于使用gradle上传library到jcenter的实践基本就这样,在实践之前也参考了很多文章,但过程都基本类似,大家可以对比一下,自己按照这些步骤实践一下,看是否会遇到一些坑,踩坑并填坑的过程就是你经验的积累,我为什么要去了解这些内容,笔者以前在开发app并没有太关注这些,但从应用开发者转变成SDK开发者之后,从使用轮子到创造轮子的转变,需要我关注这些,从知道是什么到为什么再到怎么做,这对我们深入学习知识非常重要。