环境
AndroidStudio 1.2.1.1正式版
本教程以我的一个测试仓库作为DEMO,名为JCenterDemo。本教程只涉及如何打包aar至JCenter仓库,如何使用git不在本教程涉及之内,所以本文只是单单在Github建立了一个同名仓库而已,不过可以推荐一个入门git教程GitBook
本教程解决javadoc乱码问题,包含第三方依赖的javadoc打包失败问题以及install任务生成pom文件失败问题。
一.在GitHub中新建一个仓库,并记录下URL,如https://github.com/ls1110924/JCenterDemo
二.注册bintray账号
在https://bintray.com/上注册一个账号。并记录下你的UserId和API Key,UserId即为你的登陆ID,API Key相当与一种授权,方便你可以不用填入密码就可以上传文件至仓库。
三.创建你的工程,如我创建的工程为下图
一般来说上传至公共仓库的均为Library,所以本例也以一个Lib作为示例。并新建一个Module名为JCenterLib的Lib。
此时工程目录结构为
四.完成你个人的库
如本文新建了两个Handler的工具类,分别适用于Activity和Fragment。
如这是该示例库中的适用于Fragment的Handler工具类
package com.cqu.jcenterlib;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import java.lang.ref.SoftReference;
/**
* Created by A Shuai on 2015/5/2.
* 适用于Fragment的Handler的抽象模板类
*/
public abstract class AbsFragmentHandler extends Handler {
private final SoftReference mFragmentRef;
public AbsFragmentHandler(T mFragment) {
mFragmentRef = new SoftReference(mFragment);
}
/**
* 不许覆写,若对需对消息处理可对{@link #handleMessage(Fragment, Message, Bundle)}进行覆写
*
* @param msg Message消息对象
*/
@Override
public final void handleMessage(Message msg) {
T mFragment = mFragmentRef.get();
if (mFragment == null) {
return;
}
handleMessage(mFragment, msg, msg.getData());
}
/**
* 主要的消息处理逻辑
*
* @param mFragment 类型参数T所指定的Fragment对象
* @param msg Message消息对象
* @param mBundle 可以为null
*/
protected abstract void handleMessage(T mFragment, Message msg, Bundle mBundle);
}
在app这个Module的build.gradle文件中加入一项依赖,即可在app这个Module中使用JCenterLib中定义的工具类了。
complile project(':JCenterLib')
六.打开项目根目录中的build.gradle 添加 buildscript 的 reposiories
classpath 'com.github.dcendents:android-maven-plugin:1.2'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
classpath 'com.github.dcendents:android-maven-plugin:1.2'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
七.在JCenterLib这个Module中新建一个文件,名为bintray.gradle
内容为:
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'
group = PROJ_GROUP
version = PROJ_VERSION
project.archivesBaseName = PROJ_ARTIFACTID
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
}
task javadoc(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
artifacts {
archives javadocJar
archives sourcesJar
}
javadoc {
options{
encoding "UTF-8"
charSet 'UTF-8'
author true
version true
links "http://docs.oracle.com/javase/7/docs/api"
}
}
install {
repositories.mavenInstaller {
// This generates POM.xml with proper parameters
pom.artifactId = PROJ_ARTIFACTID
pom {
project {
description PROJ_DESCRIPTION
packaging 'aar'
name PROJ_NAME
url PROJ_WEBSITEURL
licenses {
license {
name LICENSE_NAME
url LICENSE_URL
}
}
developers {
developer {
id DEVELOPER_ID
name DEVELOPER_NAME
email DEVELOPER_EMAIL
}
}
scm {
connection PROJ_VCSURL
developerConnection PROJ_VCSURL
url PROJ_WEBSITEURL
}
}
}
}
}
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
bintray {
user = properties.getProperty("bintray.user")
key = properties.getProperty("bintray.apikey")
configurations = ['published','archives']
publish = true
pkg {
repo = "maven"
name = PROJ_NAME
desc = PROJ_DESCRIPTION
websiteUrl = PROJ_WEBSITEURL
issueTrackerUrl = PROJ_ISSUETRACKERURL
vcsUrl = PROJ_VCSURL
licenses = ["Apache-2.0"]
publicDownloadNumbers = true
}
}
*注:此文件中规定了生成javadoc的编码格式为utf-8,所以大家在使用各种IDE时为了避免各种乱码问题,应在设置中将工作空间的编码设置为统一采用utf-8编码.
八.同样在JCenterLib这个Module下新建一个名为gradle.properties的文件
内容为:
PROJ_GROUP=com.github.ls1110924.library
PROJ_VERSION=1.0.0
PROJ_NAME=JCenterLib
PROJ_WEBSITEURL=https://github.com/ls1110924/JCenterDemo
PROJ_ISSUETRACKERURL=https://github.com/ls1110924/JCenterDemo/issues
PROJ_VCSURL=https://github.com/ls1110924/JCenterDemo.git
PROJ_DESCRIPTION=A Test Lib
PROJ_ARTIFACTID=JCenterLib
LICENSE_NAME='The Apache Software License, Version 2.0'
LICENSE_URL='http://www.apache.org/licenses/LICENSE-2.0.txt'
DEVELOPER_ID=ls1110924
DEVELOPER_NAME=A Shuai
[email protected]
PROJ_GROUP 为你上传的构件的Group,如compile 'com.android.support:appcompat-v7:22.2.0'中的com.android.support
PROJ_VERSION 为你此次上传构件的版本号,如compile 'com.android.support:appcompat-v7:22.2.0'中的22.2.0,以后更新构件重新上传的时候只需要修改这里就好。
PROJ_NAME 为上传到你bintray的maven仓库的仓库名,即他会在你的maven仓库中新建一个子仓库,并使用这个值作为仓库名。
PROJ_WEBSITEURL 为你的工程网站的url,一般为你的Github项目地址,如https://github.com/ls1110924/LightUtils
PROJ_ISSUETRACKERURL 为你的工程issue的url,一般为https://github.com/ls1110924/LightUtils/issues
PROJ_VCSURL 为你的项目版本控制系统的url,一般为https://github.com/ls1110924/LightUtils.git,切不可忘记最后面的.git
PROJ_DESCRIPTION 为你的项目描述,大家随意填写
PROJ_ARTIFACTID 为你的构件ID,如如compile 'com.android.support:appcompat-v7:22.2.0'中的appcompat-v7
LICENSE_NAME和LICENSE_URL保持不变即可
DEVELOPER_ID为开发者ID,大家随意填写
DEVELOPER_NAME为开发者姓名,随意填写
DEVELOPER_EMAIL为开发者邮箱,最后填写正确的邮箱,什么邮箱都可以
*注意:这里最好把构件ID的命名和你要打包上传的Module同名,如若不喜欢Module名作为构件ID,下面教大家动态修改Module名,这里必须同名是因为一会的上传任务是默认使用Module名作为构件ID的,这里声明的构件名就没有了效果。
这时咱们上传的构件依赖就为 complile 'com.github.ls1110924.library:JCenterLib:1.0.0'
*这里因为gradle.properties文件是咱们个人的一些私人信息配置,一般不会同步到Github的远程仓库上,这里需要在JCenterLib这个Moduel的.gitignore文件配置忽略上传gradle.properties这个文件
/gradle.properties
九.有心的旁友可能已经注意到第七步中的user和key还没有配置
其实这两个值就是我们第二步中申请bintray的UserID和分配的APIKey
打开项目根目录下的local.properties文件,这个文件项目默认提供了忽略,所以可以把一些非常私人的数据放在这里
bintray.user=ls1110924
bintray.apikey=xxxxxxxxxxxxxxxxxxxxx
十.Module改名
如果一些人不喜欢使用Module名作为PROJ_ARTIFACTID构件ID的用户可以看这一步,无所谓的朋友可以跳过这一步
打开项目根目录的settings.gradle文件,加一句
def submoduleProject = project(':JCenterLib')
submoduleProject.name = 'jcenter'
JCenterLib为我们原始的Module名,现在动态改为jcenter,修改后的setting.gradle文件内容为
include ':app', ':JCenterLib'
def submoduleProject = project(':JCenterLib')
submoduleProject.name = 'jcenter'
这是这个Module虽然目录还为JCenterLib,但是它实际的名字已经变成了jcenter,所以这时候app这个Module继续引用JCenterLib就会报错,所以应修改为app这个Module
下的build.gradle文件中的依赖,
从
complile project(':JCenterLib')
compile project(':jcenter')
同时修改JCenterLib这个Module中gradle.properties中的
PROJ_ARTIFACTID=jcenter
此时gradle.properties文件内容为:
PROJ_GROUP=com.github.ls1110924.library
PROJ_VERSION=1.0.0
PROJ_NAME=JCenterLib
PROJ_WEBSITEURL=https://github.com/ls1110924/JCenterDemo
PROJ_ISSUETRACKERURL=https://github.com/ls1110924/JCenterDemo/issues
PROJ_VCSURL=https://github.com/ls1110924/JCenterDemo.git
PROJ_DESCRIPTION=A Test Lib
PROJ_ARTIFACTID=jcenter
LICENSE_NAME='The Apache Software License, Version 2.0'
LICENSE_URL='http://www.apache.org/licenses/LICENSE-2.0.txt'
DEVELOPER_ID=ls1110924
DEVELOPER_NAME=A Shuai
[email protected]
那么此时使用此构建的依赖就变为 complile 'com.github.ls1110924.library:jcenter:1.0.0'
十一.在JCenterLib这个Module中的build.gradle文件末尾加一句
apply from: 'bintray.gradle'
apply plugin: 'com.android.library'
android {
compileSdkVersion 21
buildToolsVersion "22.0.1"
defaultConfig {
minSdkVersion 8
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
}
apply from: 'bintray.gradle'
*此时应进行一次Sync同步操作,因为修改了build.gradle文件,还可以为预防没有生成响应的打包任务。
十二.执行生成sources.jar任务
展开JCenterDemo - :jcenter - Tasks - other
执行其中的sourcesJar任务,一般这个任务不会出错,都会在JCenterLib/build/libs下生成源代码的jar包,名字为 ModuleName-版本号-sources.jar,如jcenter-1.0.0-sources.jar。
十三,生成javadoc文件
同样运行other中的javadoc任务,如果你的项目中使用了第三方依赖或libs文件中第三方jar包,这个任务有可能会出错,出错异常为程序包不存在或者找不到符号等。
但是不用担心,其实这个任务已经算是执行完毕了,他在JCenterLib/build下生成了一个docs的文件夹,并把生成好的html文件放在其中
十四.执行打包生成javadoc.jar文件
执行同样位于other下的javadocJar任务,如果没有出错,会在JCenterLib/build/libs下生成对应的javadoc.jar文件,但是如果出错,则需要我们手动打包javadoc.jar文件
(1)复制我上传的附件中的META-INF文件夹到JCenterLib/build/docs/javadoc/文件内,如图
打开此压缩包看到的效果应如图:
(3)复制此zip包到JCenterLib/build/libs目录下,并改名为 ModuleName-版本号-javadoc,并将文件后缀名从zip修改为jar
十五.生成pom文件
执行同为other下的install任务,如果任务成功会在JCenterLib/build/下生成poms文件夹以及其中的pom-default.xml文件
(1)如果任务失败,则需我们手动配置此文件,同样复制我上传的附件中的poms文件夹至JCenterLib/build/下
(2)使用任意一款编辑器修改poms文件夹下的pom-default.xml文件
4.0.0
com.github.ls1110924.library
jcenter
1.0.0
aar
JCenterLib
A Test Lib
https://github.com/ls1110924/JCenterDemo
'The Apache Software License, Version 2.0'
'http://www.apache.org/licenses/LICENSE-2.0.txt'
ls1110924
A Shuai
[email protected]
https://github.com/ls1110924/JCenterDemo.git
https://github.com/ls1110924/JCenterDemo.git
https://github.com/ls1110924/JCenterDemo
com.android.support
appcompat-v7
22.2.0
compile
groupId 对应 PROJ_GROUP
artifactId 对应 PROJ_ARTIFACTID
version 对应 PROJ_VERSION
name 对应 PROJ_NAME
description 对应 PROJ_DESCRIPTION
url 对应 PROJ_WEBSITEURL
developer-id 对应 DEVELOPER_ID
developer-name 对应 DEVELOPER_NAME
developer-email 对应 DEVELOPER_EMAIL
connection 对应 PROJ_VCSURL
developerConnection 对应 PROJ_VCSURL
url 对应 PROJ_WEBSITEURL
dependencies标签代表了你的这个库所使用的依赖,但仅限build.gradle中声明的依赖,libs文件夹中的jar包不算
个人可根据个人情况自行增删,但dependency-scope标签应保持compile不变
十六.最后一步,运行bintrayUpload任务即可
十七.登陆bintray网站,进行最后一次检查。
首先打开自己的maven仓库,找到刚刚上传的仓库并打开;然后切换到Files的Tab页。
(1)此时应该看到一个以版本命名的文件夹和一个名为maven-metadata.xml的文件,并把maven-metadata.xml文件下载下来(点击maven-metadata.xml即可下载),maven-metadata.xml文件的内容应为:
com.github.ls1110924.library
jcenter
1.0.0
1.0.0
1.0.0
1.0.0
20150612080145
此时检查groupId,artifactId和version三个标签是否同你设置的一致,重点检查artifactId这个标签,这个标签一般和ModuleName一致,如果你动态修改了ModuleName,则检查当前的值是否和你动态修改后的值一致,如果不一致,则清理工程,重新构建并执行任务和上传。
(2)检查版本号文件夹下的内容。
正常情况下,应该有四个文件,分别为javadoc.jar,sources.jar,aar和pom文件,如果不对则应是三个打包任务没有执行重新(aar打包任务不需干预),则需全部执行完毕再上传即可
*注:如果重新上传,则应该把当前存在的所有文件删除再上传,否则会出现冲突。
十八.将当前仓库关联到jcenter仓库以便AndroidStudio能够方便的进行依赖。
首先切换到General这个Tab页,然后点击右下方的 Add to JCenter按钮
在1处随便填一些你的lib的介绍即可,然后点击send按钮即可
如果管理员审核通过后会在3箭头所指之处进行通知
十九.最后我们就可以在我们的项目以外方便的引入这个库了
引入的代码为
compile 'com.github.ls1110924.library:jcenter:1.0.0'
附件:下载地址