首页 > 系统 > Android > 正文

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

2019-11-09 14:58:26
字体:
来源:转载
供稿:网友

环境

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 copypackage 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 copycomplile project(':JCenterLib')  

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

[Javascript] view plain copyclasspath 'com.github.dcendents:android-maven-plugin:1.2'  classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'  编辑前:

[javascript] view plain copybuildscript {      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 copybuildscript {      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操作时看到详细的错误如下:最后修改的全局引用配置文件如下://%20Top-level%20build%20file%20where%20you%20can%20add%20configuration%20options%20common%20to%20all%20sub-projects/modules.buildscript%20{%20%20%20%20repositories%20{%20%20%20%20%20%20%20%20jcenter()%20%20%20%20}%20%20%20%20dependencies%20{%20%20%20%20%20%20%20%20classpath%20'com.android.tools.build:gradle:2.2.2'//%20%20%20%20%20%20%20%20classpath%20'com.github.dcendents:android-maven-plugin:1.2'//%20%20%20%20%20%20%20%20classpath%20'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'%20%20%20%20%20%20%20%20//1.自动化maven打包插件%20%20%20%20%20%20%20%20classpath%20'com.github.dcendents:android-maven-gradle-plugin:1.5'%20%20%20%20%20%20%20%20//2.自动上传至Bintray平台插件%20%20%20%20%20%20%20%20classpath%20'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2'%20%20%20%20%20%20%20%20//NOTE:%20Do%20not%20place%20your%20application%20dependencies%20here;%20they%20belong%20%20%20%20%20%20%20%20//in%20the%20individual%20module%20build.gradle%20files%20%20%20%20}}allprojects%20{%20%20%20%20repositories%20{%20%20%20%20%20%20%20%20jcenter()%20%20%20%20}}task%20clean(type:%20Delete)%20{%20%20%20%20delete%20rootProject.buildDir}重修sync,编译通过了

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

内容为:

[javascript] view%20plain copyapply 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      }  }  

 %20 %20*注:此文件中规定了生成javadoc的编码格式为utf-8,所以大家在使用各种IDE时为了避免各种乱码问题,应在设置中将工作空间的编码设置为统一采用utf-8编码.

八.同样在JCenterLib这个Module下新建一个名为gradle.properties的文件

内容为:

[javascript] view%20plain copyPROJ_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   %20 %20我先依次解释一下每个条目的意义

 %20  PROJ_GROUP%20为你上传的构件的Group,如compile%20'com.Android.support:appcompat-v7:22.2.0'中的com.android.support

 %20  PROJ_VERSION%20为你此次上传构件的版本号,如compile%20'com.android.support:appcompat-v7:22.2.0'中的22.2.0,以后更新构件重新上传的时候只需要修改这里就好。

 %20  PROJ_NAME%20为上传到你bintray的maven仓库的仓库名,即他会在你的maven仓库中新建一个子仓库,并使用这个值作为仓库名。

 %20  PROJ_WEBSITEURL%20为你的工程网站的url,一般为你的Github项目地址,如https://github.com/ls1110924/LightUtils

 %20  PROJ_ISSUETRACKERURL%20为你的工程issue的url,一般为https://github.com/ls1110924/LightUtils/issues

 %20 %20PROJ_VCSURL%20为你的项目版本控制系统的url,一般为https://github.com/ls1110924/LightUtils.git,切不可忘记最后面的.git

 %20  PROJ_DESCRIPTION%20为你的项目描述,大家随意填写

 %20  PROJ_ARTIFACTID%20为你的构件ID,如如compile%20'com.android.support:appcompat-v7:22.2.0'中的appcompat-v7

 %20  LICENSE_NAME和LICENSE_URL保持不变即可

 %20  DEVELOPER_ID为开发者ID,大家随意填写

 %20  DEVELOPER_NAME为开发者姓名,随意填写

 %20  DEVELOPER_EMAIL为开发者邮箱,最后填写正确的邮箱,什么邮箱都可以

 %20  

 %20 %20*注意:这里最好把构件ID的命名和你要打包上传的Module同名,如若不喜欢Module名作为构件ID,下面教大家动态修改Module名,这里必须同名是因为一会的上传任务是默认使用Module名作为构件ID的,这里声明的构件名就没有了效果。

 %20 %20这时咱们上传的构件依赖就为%20 complile%20'com.github.ls1110924.library:JCenterLib:1.0.0'

 %20 %20*这里因为gradle.properties文件是咱们个人的一些私人信息配置,一般不会同步到Github的远程仓库上,这里需要在JCenterLib这个Moduel的.gitignore文件配置忽略上传gradle.properties这个文件

[javascript] view%20plain copy/gradle.properties  

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

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

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

[javascript] view%20plain copybintray.user=ls1110924  bintray.apikey=xxxxxxxxxxxxxxxxxxxxx  

十.Module改名

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

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

[javascript] view%20plain copydef submoduleProject = project(':JCenterLib')  submoduleProject.name = 'jcenter'  

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

[javascript] view%20plain copyinclude ':app', ':JCenterLib'    def submoduleProject = project(':JCenterLib')  submoduleProject.name = 'jcenter'   %20 %20这是这个Module虽然目录还为JCenterLib,但是它实际的名字已经变成了jcenter,所以这时候app这个Module继续引用JCenterLib就会报错,所以应修改为app这个Module

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

[javascript] view%20plain copycomplile project(':JCenterLib')  修改为

[javascript] view%20plain copycompile project(':jcenter')  

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

[javascript] view%20plain copyPROJ_ARTIFACTID=jcenter  

 %20 %20此时gradle.properties文件内容为:

[javascript] view%20plain copyPROJ_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  

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

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

[javascript] view%20plain copyapply from: 'bintray.gradle'  此时该文件内容为

[javascript] view%20plain copyapply 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'   %20 %20这时基本完成了所有的编写工作,接下来开始打包各种jar文件并上传即可

 %20 %20*此时应进行一次Sync同步操作,因为修改了build.gradle文件,还可以为预防没有生成响应的打包任务。

十二.执行生成sources.jar任务

 %20 %20展开JCenterDemo%20-%20:jcenter%20-%20Tasks%20-%20other

    执行其中的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 copycompile 'com.github.ls1110924.library:jcenter:1.0.0'  

附件:下载地址


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表