使用Gradle(Android Studio)发布Android开源项目到jCenter

2016-01-04

使用Android Studio进行Android开发的时候,有些第三方库的引用只需要一句话

compile 'com.squareup.picasso:picasso:2.3.2'

第一次用的时候感觉很神奇,等到自己参与到开源组件的开发的时候,也想实现这种效果,应该怎么操作呢?本文就介绍一下如何使用Gradle发布到jCenter。

一、注册账号及获取API Key

首先,我们需要一个Bintray的账号,在https://bintray.com进行注册。

网站会分配个每个注册账号一个唯一的API Key,作为身份标识,所以注册完毕之后我们需要找到API Key,进入https://bintray.com并登录,鼠标移至右上角你的用户名处,点击Your Profile,如图

01

然后点击头像旁边的Edit,

02

最后点击API Key切换到该页面,点击Show查看你的API Key并复制保存下来,接下来要用到。

03

二、配置Gradle

1、配置全局Gradle

找到Gradle的目录,根据你的操作系统的不同,该目录位于

Windows XPC:\Documents and Settings\用户名\.gradle
Windows 7及以上C:\Users\用户名\.gradle
Mac OS/Users/用户名/.gradle

打开目录下的gradle.properties文件(如果文件不存在则新建),添加Bintray信息到文件末尾

BINTRAY_USER=celerysoft
BINTRAY_KEY=********************

BINTRAY_USER为你在Bintray注册的用户名,BINTRAY_KEY则为刚才获取到的API Key。

当然,你也可以选择在每个项目中的gradle.properties文件添加上述Bintray信息,但这样做十分繁琐,还需要将该文件添加到.gitignore中,防止泄露了个人信息。

2、配置项目Gradle

我们开发开源控件时,一般都会包含两个module,librarydemo,demo为控件的使用示例,library才是控件的实际源码,上传到jCenter时只需要上传library模块就行。

修改项目根目录的build.gradle文件

在dependencies下添加一行

classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3'

添加完之后gradle.properties文件的内容大概如下

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.0'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3'

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

allprojects {
repositories {
jcenter()
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

修改项目library目录的build.gradle文件

在文件末尾添加一行:apply from: 'bintray.gradle'

bintray.gradle暂时还不存在,我们需要在library目录下创建它,并修改它的内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
group = PROJ_GROUP
version = PROJ_VERSION
project.archivesBaseName = PROJ_ARTIFACTID

apply plugin: 'com.jfrog.bintray'
//apply plugin: "com.jfrog.artifactory"
apply plugin: 'maven-publish'

task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
}

task javadoc(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += configurations.compile
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}

task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}

javadoc {
options{
encoding "UTF-8"
charSet 'UTF-8'
author true
version true
links "http://docs.oracle.com/javase/7/docs/api"
title PROJ_ARTIFACTID
}
}

def pomConfig = {
licenses {
license {
name PROJ_LICENSE
url PROJ_LICENSE_URL
distribution "repo"
}
}
developers {
developer {
id DEVELOPER_ID
name DEVELOPER_NAME
email DEVELOPER_EMAIL
}
}
}

publishing {
publications {
mavenJava(MavenPublication) {
artifactId PROJ_ARTIFACTID
artifact javadocJar
artifact sourcesJar

pom.withXml {
def root = asNode()
root.appendNode('description', PROJ_DESCRIPTION)
root.children().last() + pomConfig

def dependenciesNode = root.appendNode('dependencies')
configurations.compile.allDependencies.each {
if (it.group && it.name && it.version) {
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', it.group)
dependencyNode.appendNode('artifactId', it.name)
dependencyNode.appendNode('version', it.version)
}
}
}
}
}
}

afterEvaluate {
publishing.publications.mavenJava.artifact(bundleRelease)
}

bintray {
user = hasProperty("bintrayUser")?getProperty("bintrayUser"):getProperty("BINTRAY_USER")
key = hasProperty("bintrayKey")?getProperty("bintrayKey"):getProperty("BINTRAY_KEY")

publications = ['mavenJava']
publish = true

pkg {
repo = 'maven'
name = PROJ_NAME
licenses = [PROJ_LICENSE]
vcsUrl = PROJ_VCSURL
userOrg = user

version {
name = PROJ_VERSION
released = new Date()
desc = PROJ_VERSION_DESC
vcsTag = PROJ_VERSION
}

publicDownloadNumbers = true
}
}

84行和85行用到的就是刚才设置的全局gradle变量,Bintray的用户名和API Key,然后第1行的PROJ_GROUP和第2行的PROJ_VERSION又是啥?请继续往下看。

修改项目根目录的gradle.properties文件

在文件末尾添加如下内容

PROJ_GROUP=com.celerysoft
PROJ_VERSION=1.0.0
PROJ_VERSION_DESC=No release note left.
PROJ_NAME=MaterialDesignDialog
PROJ_ARTIFACTID=materialdesigndialog
PROJ_DESCRIPTION=Android dialog that follows the Google Material Design.
PROJ_WEBSITEURL=https://github.com/celerysoft/MaterialDesignDialog
PROJ_VCSURL=git@github.com:celerysoft/MaterialDesignDialog.git
PROJ_ISSUETRACKERURL=https://github.com/celerysoft/MaterialDesignDialog/issues
PROJ_LICENSE=MIT
PROJ_LICENSE_URL=https://raw.githubusercontent.com/celerysoft/MaterialDesignDialog/master/LICENSE

DEVELOPER_ID=celerysoft
DEVELOPER_NAME=Celery Qin
DEVELOPER_EMAIL=celerysoft@gmail.com

最终项目的引用方式为

dependencies {
compile 'com.celerysoft:materialdesigndialog:1.0.0'
}

可以发现,引用形式是PROJ_GROUP:PROJ_ARTIFACTID:PROJ_VERSION

三、上传到Bintray

由于在Windows和Mac OS下使用命令行的方法不一样,先说说怎么在Android Studio里上传吧。上面的步骤执行完之后,先同步一下项目,即Sync Project with Gradle Files,然后点击Gradle,找到library的Task下的publishing里的bintrayUpload,双击执行上传,等待上传完成即可。

升级Android Studio 2.3之后发现这个方法会导致部分文件没有生成,所以只能采用命令行上传的方法了。

在macOS下打开终端cd到项目目录,执行./gradlew build bintrayUpload即可,在Windows下估计也是类似的,我没试过,就不误导大家啦。

04

四、包含项目到jCenter

进入https://bintray.com并登录,找到你刚才上传的项目点进去,点击右下角的

05

然后写几句你的项目的介绍,然后Send,之后等待jCenter的审核,审核通过之后就可以使用

compile 'com.celerysoft:materialdesigndialog:1.0.0'

来引用你的项目了。

noBorder

除非另有声明,本博客所有文章采用的授权方式为 自由转载-非商用-非衍生-保持署名 ,转载请务必注明出处,谢谢。

文章评论



章节列表