这篇文章很长
如果已经对jcenter,maven有了一些概念,可以直接看我的另外一篇精简文章:
快速发布Abdroid Library到JCenter[精简]
另:也可以直接看具体应用实例:
https://github.com/andforce/AsyncOkHttp
开始之前先明白几个概念
maven
Maven是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具
换句话说,Maven是通过pom.xml文件的配置获取jar包的,从而省去了手动拷贝jar包到project的麻烦。
gradle
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML
翻译一下,gradle是通过Groovy语法,获取library,对Android来说不用自己拷贝jar或者aar了。
从哪里获取?
上面说的maven和gradle都是通过配置,然后自动获取,那么问题来了:从哪里获取?答案:代码仓库
就Android开发来说,目前两个比较著名的仓库是 mavenCentral
和jcenter
mavenCentral和jcenter
mavenCentral
被称为maven的权威中央仓库,但是上传library极其复杂繁琐,这也是被google换掉的原因之一;
其实从名字上看,mavenCentral有点让人困惑,会让人感觉这个仓库只支持maven的配置方式。
其实,无论是mavenCentral还是jcenter都支持maven和gradle的配置方式。
jcenter
托管在 https://bintray.com ,也可以说是这个网站在维护管理jcenter仓库;
mavenCentral()被google默认替换成jcenter()
在Android Studio早期版本中,如果我们创建一个Project,给我们的默认repository
是mavenCentral()
:
buildscript {
repositories {
mavenCentral() //现在已经被替换成了jcenter()
}
}
.
.
.
allprojects {
repositories {
mavenCentral() //现在已经被替换成了jcenter()
}
}
之后我们就可以用简单的配置,来使用library了:
implementation 'com.google.code.gson:gson:2.8.5'
正式开始
如果你读完上面的文字,我想你已经明白了,我们为什么选择上传到jcener了:Android Studio现在默认的配置的是jcenter,原因是mavenCentral上传过程太复杂。
注册bintray.com帐号
由于jcenter是托管在bintray.com上的,因此我们只要有bintray的帐号,就可以管理我们自己上传的library了。
注册这一步就不说了,没什么特别的,按照要求填写就行了。
1:添加一个新的Repository,当然如果你不想添加,bintray默认会有一个名字是maven
的Repository(不想添加可跳过次步骤)
填写相关信息:
2:在Repository中添加一个Package
3:获取bintray.user和bintray.apikey,下面使用插件上传要用到
bintray.user 就是你注册时候填写的用户名,这没什么好说的。
下面主要说一下如何获取bintray.apikey:
到此,我们bintray上的配置就完全结束了:
4:编写要上传的Library的代码
使用Android Studio创建一个工程,这个工程其实的作用是为了上传和测试你自己要上传的Library。
图中的asyncokhttp
其实就是一个module(Android Library),这个库其实就是封装了一下okhttp3
,让其能在主线程直接调用网络请求。
看一下asyncokhttp
的依赖:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
// 省略了一些不重要的信息
//这里依赖okhttp3
implementation 'com.squareup.okhttp3:okhttp:3.12.0'
}
5:使用插件开始上传
在编写测试完毕你的代码之后,我们就可以使用插件开始上传你的库了
这里用到的插件一共有两个:
1:maven插件,主要用来帮助生成和打包maven所需要上传的文件
apply plugin: 'com.github.dcendents.android-maven'
2:bintray插件,主要用来打包和上传库到bintray网站
apply plugin: 'com.jfrog.bintray'
在Project的build.gradle
(根目录)中添加:
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.3.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
// 下面两行是新添加的
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4'
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
}
}
在Project的的local.properties中添加上面获取到的bintray.user 和bintray.apikey
在Moudle的目录下创建3个文件:
1:android-maven-install.grdle
主要是使用apply plugin: 'com.github.dcendents.android-maven'
插件,完成maven相关文件的生成与打包。
内容:
apply plugin: 'com.github.dcendents.android-maven'
install {
repositories.mavenInstaller {
// This generates POM.xml with proper parameters
pom {
project {
packaging libraryPackaging
groupId publishedGroupId
artifactId artifact
// Add your description here
name libraryName
description libraryDesc
url websiteUrl
// Set your license
licenses {
license {
name licenseName
url licenseUrl
}
}
developers {
developer {
id developerId
name developerName
email developerEmail
}
}
scm {
connection websiteUrl
developerConnection websiteUrl
url websiteUrl
}
}
}
}
}
2:android-tasks.gradle
主要是生成javadoc.jar和sorce.jar:
task javadoc(type: Javadoc) {
options.encoding = "utf-8"
source = android.sourceSets.main.java.srcDirs
classpath += files(android.bootClasspath)
options {
//links "http://docs.oracle.com/javase/7/docs/api/"
linksOffline "https://developer.android.com/reference","${android.sdkDirectory}/docs/reference"
encoding = "UTF-8"
}
exclude '**/BuildConfig.java'
exclude '**/R.java'
android.libraryVariants.all { variant ->
variant.javaCompileProvider.configure{
javadoc.classpath += files(it.classpath.files)
}
}
}
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
}
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
artifacts {
archives javadocJar
archives sourcesJar
}
3:bintray.gradle
主要是用apply plugin: 'com.jfrog.bintray'
完成文件的打包上传到bintray.com
内容:
apply plugin: 'com.jfrog.bintray'
configurations {
optional
compile.extendsFrom optional
}
def siteUrl = project.websiteUrl
def gitUrl = project.vcsUrl
def libName = project.name
group = project.publishedGroupId
version = project.versionName
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 = project.bintrayRepo //发布到Bintray的maven库
name = libName //发布到Bintray上的项目名字
desc = project.libraryDesc
override = true
publish = true
publicDownloadNumbers = true
websiteUrl = siteUrl
issueTrackerUrl = project.issueTrackerUrl
vcsUrl = gitUrl
licenses = [project.licenseName]
publish = true
//attributes = ['gradle-plugin': 'com.use.less:com.use.less.gradle:gradle-useless-plugin']
version {
desc = project.libraryVersionDesc
released = new Date()
gpg {
sign = true //Determines whether to GPG sign the files. The default is false
passphrase = properties.getProperty("bintray.gpg.password")
//Optional. The passphrase for GPG signing'
}
}
}
}
6:配置Library的相关信息
在module的build.gradle
的最后添加:
ext {
libraryPackaging = 'aar' //上传aar形式的打包文件
// jcenter
bintrayRepo = "network" // 你上传的位于bintray中的Repository名称,如果没有创建会有一个叫maven的
name = 'asyncokhttp' // 必须和library module的名字相同
libraryDesc = 'A OkHttp Library'
publishedGroupId = 'org.zarroboogs.http.asyncokhttp' // 填写groupId, 一般是包名,比如:com.android.support
versionName = '1.0.1' // 版本号,比如:22.2.1
websiteUrl = 'https://github.com/andforce/AsyncOkHttp' // 可以填写github上的库地址.
issueTrackerUrl = 'https://github.com/andforce/AsyncOkHttp/issues' // 可以填写github库的issue地址.
vcsUrl = 'https://github.com/andforce/AsyncOkHttp.git' // 可以填写github上库的地址.
licenseName = "Apache-2.0"
libraryVersionDesc = 'version descriotion'
// maven
artifact = 'asyncokhttp' // 必须和library module的名字相同
libraryName = 'asyncokhttp'
developerId = 'anforce'
developerName = 'andforce'
developerEmail = '86118@163.com'
licenseName = 'The Apache Software License, Version 2.0'
licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
apply from: 'android-maven-install.gradle'
apply from: 'android-tasks.gradle'
apply from: 'bintray.gradle'
7:运行命令上传发布的你的Library
在Project的根目录:
#编译
./gradlew install
#上传
./gradlw bintrayUpload
8:手动提交到jcenter
在运行上面的命令之后,我们就可以在bintray的Repo中看到刚刚上传的Library 了。
但是这个时候,还没有正式发布到jcenter,我需要用手主动提交一下:
点击Add to JCenter
之后,会有一个审核时间,大约24小时后,就可以在JCenter上看到了。
简化
从上面教程我们可以看到,每次都需要创建和引用3个文件,还是挺麻烦的。
apply from: 'android-maven-install.gradle'
apply from: 'android-tasks.gradle'
apply from: 'bintray.gradle'
为了引用方便,可以把上面三个gradle内容放到一个文件中,这样引用一行,效果和上面引用3个文件是一样的
//apply from: 'android-maven-install.gradle
//apply from: 'android-tasks.gradle'
///apply from: 'bintray.gradle'
apply from: 'jcenter.gradle'
这样每次创建一个文件就好了。
其实还能进一步简化:
为了不需要每次都创建这个文件,还可以把这个配置文件放到网络上:
https://github.com/andforce/release-android-lib-to-jcenter
https://raw.githubusercontent.com/andforce/release-android-lib-to-jcenter/master/jcenter.gradle
所以最终,我们的引用方式变成了这样
apply from: 'https://raw.githubusercontent.com/andforce/release-android-lib-to-jcenter/master/jcenter.gradle'
最后,之前编译和上传的命令,也可以合并成一个了:
#编译
#./gradlew install
#上传
#./gradlw bintrayUpload
# 上面的合并成一条
./gradlew jcenter