前一篇文章Android 进阶——上传Java项目至JCenter远程仓库完全攻略(二)总结了上传Gradle插件至JCenter并使用的基本知识,这一篇主要总结下上传AAR到JCenter远程仓库的核心流程,其实也不难就是使用官方提供的插件。
上传Android项目和上传Java项目核心步骤大同小异,区别在于上传AAR的时候要发布的构件种类不同,原来的maven-publish可能不是很方便,所以替换成专门用于发布Android项目的插件android-maven-gradle-plugin插件。
/**
* 配置bintray.gradle:gradle-bintray-plugin插件
* 和android-maven-gradle-plugin插件的信息
*/
buildscript {
repositories {
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.0'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
}
}
必须先配置插件的远程库和classpath,才能引入这两个插件。
//引入android-maven插件上传android项目
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'
引入android-maven插件成功之后会在对应的Module下的Gradle Tasks下的other---->install 任务,执行这个任务如果配置没有出错的话就会在生成POM文件,如下图所示:
而引入bintray插件成功之后会在对应的Module下的Gradle Tasks下的publishing---->bintrayUpload 任务,执行这个bintrayUpload任务就是用于上传配置的工件到JCenter的。
注意:这里有个天坑,有时候你直接在Tasks 列表下双击对应的任务执行的话,会出现莫名其妙的错误,但是你只要换成使用命令行去手动指定要执行的任务gradlew :aartest:install和gradlew :aartest:bintrayUpload就不会报错了相同的错误了,但是上传的过程你得确保你有一个足够好的网络否则会出现很多问题的。
此处我是把aar和docs都上传到JCenter。
/**
* 源代码打包任务(名为libaar-1.0-source.jar)
*/
task sourcesJar(type:Jar){
//如果这里不配置的话会自动以Module名称命名
// baseName "jcaar"
//分类器,用于区别其他jar包
classifier "sources"
//从android main源集中的所有代码,对应构建脚本中的子节点sourceSets 中的信息
from android.sourceSets.main.java.srcDirs
}
/**
* 自定义task 创建android 文档,因为Android项目没有类似Java项目中的[javadoc,groovydoc]
* 因此需要自己定义task 创建文档,根据Gradle提供的Javadoc 类传入指定的参数即可
* @param Javadoc org.gradle.api.tasks.javadoc
*/
task myjavadoc(type: Javadoc){
failOnError false //必须添加以免出错
options{
//如果你的项目里面有中文注释的话,必须将格式设置为UTF-8,不然会出现乱码
encoding "UTF-8"
charSet 'UTF-8'
author true
version true
links "http://docs.oracle.com/javase/7/docs/api"
}
source = android.sourceSets.main.java.srcDirs
//这里传入的不是classifier分类器,因为这个任务的产出不是jar包,把编译时所有的calsspath传递到Javadoc中
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
/**
* 把自动生成的DOc打包成Jar包(名为libaar-1.0-doc.jar),
* 这个docJar 依赖于系统的两个任务,因为只有这两个任务生成doc之后才能把它们的产出打包到一起
*/
task docJar(type: Jar,dependsOn:[myjavadoc]){
classifier 'doc' //分类器 区分其他jar包
from myjavadoc.destinationDir
}
/**
* 配置工程工件 即产出的配置,默认有aar包,没有docJar
*/
artifacts{
archives sourcesJar
archives docJar
}
/**
* 可使用两种方式进行配置,1)直接在gradle脚本中配置 2)获取系统单环境变量配置
* user = System.getenv('BINTRAY_USER')
key = System.getenv('BINTRAY_KEY')
...
*/
bintray{
//jcenter的用户名
user = 'crazymo'
//jcenter的用户名下的API KEY
key = userkey
configurations =['archives']
//添加上传的包的信息
pkg {
repo = 'hiplugin-demo' //需要上传到的jcenter仓库名
name = 'jcaar2' //上传的项目名
//userOrg = 'bintray_user' //jcenter中用户的org属性(可选项),对于个人账号可以不用配置
licenses = ['Apache-2.0']
vcsUrl = 'https://aar2.xxxx.git'//可以随便填写jcenter 并不能去验证,如果上传到github的话可以配置github的地址
version {
// name ="1.0" 配置版本名称如果不配置会默认使用前面的version值
desc = 'just aar test'
released = new Date()
vcsTag = '1.0'
attributes = ['gradle-plugin': 'xxxxx']
}
}
}
上传到jcenter至少需要四个文件,除了打包的aar之外,还需要pom和javadoc,source,否则是通不过jcenter审核的,这里的功能相当于是maven-publish插件的publishing节点,具体可以参考android-maven-plugin
/**
* 这个是android-maven插件提供的,还可以配置很多信息,这只是最简单的配置,具体可以参考Github上的文档,
* project homepage我这里随便乱写的,如果托管在gayHub或者码云上可以写码云的位置
*/
def siteUrl = 'https://blog.csdn.net/CrazyMo_'
def gitUrl = 'https://blog.csdn.net/CrazyMo_' // project git
//这里直接影响POM文件的结构
install {
repositories.mavenInstaller {
// This generates POM.xml with proper parameters
pom {
project {
packaging 'aar'
name ' test for Android'
url siteUrl
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
distribution 'repo'
}
}
developers {
developer { //填写的一些基本信息
id 'crazymo'
name 'Crazy.Mo'
email '[email protected]'
}
}
scm {
connection gitUrl
developerConnection gitUrl
url siteUrl
}
}
}
}
}
先执行install任务生成POM,再执行bintrayUpload上传到JCenter,成功之后还需要点击Publish All(界面和上一篇有所不同,因为JCenter 的界面改版了,而我5.21日写上一篇文章的时候还没有改版,Add to JCenter 也移到了Action下,Orz…),当需要更新信息或者版本时最后也先执行下install任务
最终完整的上传脚本uploadaar2jc.gradle(也可以参考GayHub这个脚本)
//配置Gradle插件支持的,引入时需要的信息
//最终引用形式对应POM里的,如compile 'group:artifactId:version'
group "com.crazymo.jcaar"
version 2.0
/***********************引入插件********************************************************/
//引入android-maven插件和bintray插件上传android项目
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'
/***************************引入插件 end*******************************************/
/***************************创建自定义task 打包要上传到JCenter的产物**********************/
/**
* 源代码打包任务(名为libaar-1.0-source.jar)
*/
task sourcesJar(type:Jar){
//如果这里不配置的话会自动以Module名称命名
// baseName "jcaar"
//分类器,用于区别其他jar包
classifier "sources"
//从android main源集中的所有代码,对应构建脚本中的子节点sourceSets 中的信息
from android.sourceSets.main.java.srcDirs
}
/**
* 自定义task 创建android 文档,因为Android项目没有类似Java项目中的[javadoc,groovydoc]
* 因此需要自己定义task 创建文档,根据Gradle提供的Javadoc 类传入指定的参数即可
* @param Javadoc org.gradle.api.tasks.javadoc
*/
task myjavadoc(type: Javadoc){
failOnError false //必须添加以免出错
options{
//如果你的项目里面有中文注释的话,必须将格式设置为UTF-8,不然会出现乱码
encoding "UTF-8"
charSet 'UTF-8'
author true
version true
links "http://docs.oracle.com/javase/7/docs/api"
}
source = android.sourceSets.main.java.srcDirs
//这里传入的不是classifier分类器,因为这个任务的产出不是jar包,把编译时所有的calsspath传递到Javadoc中
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
/**
* 把自动生成的DOc打包成Jar包(名为libaar-1.0-doc.jar),
* 这个docJar 依赖于系统的两个任务,因为只有这两个任务生成doc之后才能把它们的产出打包到一起
*/
task docJar(type: Jar,dependsOn:[myjavadoc]){
classifier 'doc' //分类器 区分其他jar包
from myjavadoc.destinationDir
}
/***************************创建自定义task 打包要上传到JCenter的产物 end**************/
/***************************配置工程产出的工件,即要上传到JCenter的产物****************/
/**
* 配置工程工件 即jar产出的配置,默认有java jar包,没有sourcesJar和docJar
*/
artifacts{
archives sourcesJar
archives docJar
}
/***************************配置工程产出的工件,即要上传到JCenter的产物 end****************/
/*************************************配置android-maven 插件的信息******************************************/
// project homepage我这里随便乱写的,如果托管在gayHub或者码云上可以写码云的位置
def siteUrl = 'https://blog.csdn.net/CrazyMo_'
def gitUrl = 'https://blog.csdn.net/CrazyMo_' // project git
//这里直接影响POM文件的结构
install {
repositories.mavenInstaller {
// This generates POM.xml with proper parameters
pom {
project {
packaging 'aar'
name 'test for Android'
url siteUrl
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
distribution 'repo'
}
}
developers {
developer { //填写的一些基本信息
id 'crazymo'
name 'Crazy.Mo'
email '[email protected]'
}
}
scm {
connection gitUrl
developerConnection gitUrl
url siteUrl
}
}
}
}
}
/*******************************配置android-maven 插件的信息 end*************************************/
/*******************************配置配置bintray插件的信息************************************/
/**
* 可使用两种方式进行配置,1)直接在gradle脚本中配置 2)获取系统单环境变量配置
*/
bintray{
//jcenter的用户名
user = 'crazymo'
//jcenter的用户名下的API KEY
key = userkey
configurations =['archives']
//添加上传的包的信息
pkg {
repo = 'hiplugin-demo' //需要上传到的jcenter仓库名
name = 'cmoaar' //上传的项目名Package Name
//userOrg = 'bintray_user' //jcenter中用户的org属性(可选项),对于个人账号可以不用配置
licenses = ['Apache-2.0']
vcsUrl = 'https://aar.xxxx.git'//可以随便填写jcenter 并不能去验证,如果上传到github的话可以配置github的地址
version {
// name ="1.0" 配置版本名称如果不配置会默认使用前面的version值
desc = 'just aar test'
released = new Date()
vcsTag = '1.0'
attributes = ['gradle-plugin': 'xxxxx']
}
}
}
/*******************************配置bintray插件的信息 end*************************************/
点击Add to JCenter之后审核成功之后,你可以直接访问 https://jcenter.bintray.com/你的group/你的artifact/版本号/库名.pom
与上面使用Jar包核心步骤大同小异,未发布到JCenter 公共库的话需要指定地址和对应的classpath 或者直接在构建脚本下的allprojects节点下配置地址(至于为什么是在allprojects节点下配置可以参考Android 进阶——Android Studio 项目结构详细述及Gradle脚本语法完全解析(一))
对于已成功审核的,再在对应Module下的dependencies 下按照compile ‘group : artifactId : version ’格式来引入依赖。
引入依赖是根据POM来的,与JCenter中配置的Package Name无关
成功引入依赖之后同样会在默认的远程缓存库中看到有三个目录分别存放pom、sourcesJar、docJar文件
调用aar中的接口方法:
ps:源码传送门或者去我的码云下去自己下载,下一篇建立自己的Nexus私人代码仓库。