您的位置:首页 > 移动开发 > Android开发

关于《在AndroidStudio中,使用Gradle打包aar到JCenter仓库!完整版教程!填补各种坑》更新验证

2017-02-09 13:22 471 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。

环境
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工具类

[java] view
plain copy

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<T extends Fragment> extends Handler {

private final SoftReference<T> mFragmentRef;

public AbsFragmentHandler(T mFragment) {

mFragmentRef = new SoftReference<T>(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中引用该lib,

在app这个Module的build.gradle文件中加入一项依赖,即可在app这个Module中使用JCenterLib中定义的工具类了。

[javascript] view
plain copy

complile project(':JCenterLib')

六.打开项目根目录中的build.gradle 添加 buildscript 的 reposiories

[javascript] view
plain copy

classpath 'com.github.dcendents:android-maven-plugin:1.2'

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

编辑前:

[javascript] view
plain copy

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()

}

}

编辑后:

[javascript] view
plain copy

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()

}

}

在Mac、android studio 2.2环境下,以上配置会编译失败,报告以下错误:



执行clear操作时看到详细的错误如下:



最后修改的全局引用配置文件如下:

// 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.2.2'

//        classpath 'com.github.dcendents:android-maven-plugin:1.2'
//        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'

//1.自动化maven打包插件
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
//2.自动上传至Bintray平台插件
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2'
//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
}


重修sync,编译通过了

七.在JCenterLib这个Module中新建一个文件,名为bintray.gradle

内容为:

[javascript] view
plain copy

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的文件

内容为:

[javascript] view
plain copy

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

DEVELOPER_EMAIL=ls1110924@gmail.com

我先依次解释一下每个条目的意义

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这个文件

[javascript] view
plain copy

/gradle.properties

九.有心的旁友可能已经注意到第七步中的user和key还没有配置

其实这两个值就是我们第二步中申请bintray的UserID和分配的APIKey

打开项目根目录下的local.properties文件,这个文件项目默认提供了忽略,所以可以把一些非常私人的数据放在这里

[javascript] view
plain copy

bintray.user=ls1110924

bintray.apikey=xxxxxxxxxxxxxxxxxxxxx

十.Module改名

如果一些人不喜欢使用Module名作为PROJ_ARTIFACTID构件ID的用户可以看这一步,无所谓的朋友可以跳过这一步

打开项目根目录的settings.gradle文件,加一句

[javascript] view
plain copy

def submoduleProject = project(':JCenterLib')

submoduleProject.name = 'jcenter'

JCenterLib为我们原始的Module名,现在动态改为jcenter,修改后的setting.gradle文件内容为

[javascript] view
plain copy

include ':app', ':JCenterLib'

def submoduleProject = project(':JCenterLib')

submoduleProject.name = 'jcenter'

这是这个Module虽然目录还为JCenterLib,但是它实际的名字已经变成了jcenter,所以这时候app这个Module继续引用JCenterLib就会报错,所以应修改为app这个Module

下的build.gradle文件中的依赖,



[javascript] view
plain copy

complile project(':JCenterLib')

修改为

[javascript] view
plain copy

compile project(':jcenter')

同时修改JCenterLib这个Module中gradle.properties中的

[javascript] view
plain copy

PROJ_ARTIFACTID=jcenter

此时gradle.properties文件内容为:

[javascript] view
plain copy

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

DEVELOPER_EMAIL=ls1110924@gmail.com

那么此时使用此构建的依赖就变为 complile 'com.github.ls1110924.library:jcenter:1.0.0'

十一.在JCenterLib这个Module中的build.gradle文件末尾加一句

[javascript] view
plain copy

apply from: 'bintray.gradle'

此时该文件内容为

[javascript] view
plain copy

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'

这时基本完成了所有的编写工作,接下来开始打包各种jar文件并上传即可

*此时应进行一次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/文件内,如图



(2)就在当前目录下,选中所有文件并右键,选择 添加到"javadoc.zip' 这个选项或类似选项生成一个zip压缩包。
打开此压缩包看到的效果应如图:



(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文件

[javascript] view
plain copy

<?xml version="1.0" encoding="UTF-8"?>

<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<modelVersion>4.0.0</modelVersion>

<groupId>com.github.ls1110924.library</groupId>

<artifactId>jcenter</artifactId>

<version>1.0.0</version>

<packaging>aar</packaging>

<name>JCenterLib</name>

<description>A Test Lib</description>

<url>https://github.com/ls1110924/JCenterDemo</url>

<licenses>

<license>

<name>'The Apache Software License, Version 2.0'</name>

<url>'http://www.apache.org/licenses/LICENSE-2.0.txt'</url>

</license>

</licenses>

<developers>

<developer>

<id>ls1110924</id>

<name>A Shuai</name>

<email>ls1110924@gmail.com</email>

</developer>

</developers>

<scm>

<connection>https://github.com/ls1110924/JCenterDemo.git</connection>

<developerConnection>https://github.com/ls1110924/JCenterDemo.git</developerConnection>

<url>https://github.com/ls1110924/JCenterDemo</url>

</scm>

<dependencies>

<dependency>

<groupId>com.android.support</groupId>

<artifactId>appcompat-v7</artifactId>

<version>22.2.0</version>

<scope>compile</scope>

</dependency>

</dependencies>

</project>

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文件的内容应为:

[javascript] view
plain copy

<?xml version="1.0" encoding="UTF-8"?>

<metadata>

<groupId>com.github.ls1110924.library</groupId>

<artifactId>jcenter</artifactId>

<version>1.0.0</version>

<versioning>

<latest>1.0.0</latest>

<release>1.0.0</release>

<versions>

<version>1.0.0</version>

</versions>

<lastUpdated>20150612080145</lastUpdated>

</versioning>

</metadata>

此时检查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箭头所指之处进行通知



十九.最后我们就可以在我们的项目以外方便的引入这个库了

引入的代码为

[javascript] view
plain copy

compile 'com.github.ls1110924.library:jcenter:1.0.0'

附件:下载地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息