AndroidStuio快速发布开源项目到Jcenter/Bintray

Posted 严振杰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AndroidStuio快速发布开源项目到Jcenter/Bintray相关的知识,希望对你有一定的参考价值。

androidStuio快速发布开源项目到Jcenter/Bintray

版权声明:转载请注明本文转自严振杰的博客: http://blog.csdn.net/yanzhenjie1003


前言

  最近做了两个开源项目,一个是Android网络框架NoHttp,和Volley、OkHttp一样做客户端请求的,更多相关信息请百度哦;另一个是Android Web服务器框架AndServer,用来在Android端搭建一个web服务器的框架,类似Java的Servlet一样,更多相关信息参见这篇博客
  为什么要说上面这一段,一个是想给自己宣传一下;另一个是这两个框架都支持Gradle一句话依赖使用,有人就问我,自己的开源项目怎么支持AndtoidStudio的gradle compile依赖呢?所以这里写一篇博客教程。

必要的准备工作

  • AndroidStudio、Gradle和自己的开源项目这个必须有。
  • Jcenter是Bintray下的一个仓库,所以Bintray帐号必须的,没有的同学看下文如何申请。
  • 网络必须是畅通的,要能访问https://bintray.com

如何申请Bintray帐号

  没有Bintray帐号的同学到Bintray官网申请,进入页面后点击右上角的Sign In登录,如果有帐号的人可以直接登录了,没有帐号的同学点击下面的Sign Up注册帐号,操作流程如图所示:

第一步,登录或注册入口

  点击Sign In按钮登陆或者注册。

第一步

第二步,登录或者到注册页面

  有帐号直接登录,或者用第三方帐号(Github、Twwiter,Google+)登录,如果没有帐号就点击Sign Up注册:

第二步

第三步,注册帐号并激活

  根据提示输入相关信息注册,邮件地址灰常重要,一定填自己最常用的,找回密码等用得到,注册好之后会收到一封激活的邮件,根据提示激活就好了。

第三步

第四步,拿到自己的ApiKey

  apikey是我们发布项目到Jcetner时必须要用的,拿到ApiKey后保存起来等下要用,步骤如下:
  

4.1打开个人配置页面,并点击[Edit]

  拿到apikey必须要先登录,登录成功后,右上角原来显示Sign In的地方显示的自己的用户名,鼠标指向用户名的时候有一个下拉菜单,我们需要点击Your Profile,出现的页面左偏上角你的头像和用户名下面有一个[Edit],图示:

个人配置页面

4.2输入登录密码复制ApiKey

  点击Edit后出来的新页面,选择左侧的[API Key],会出来如下页面,输入你登录密码点击下方的Submit后会显示一个ApiKey,图示:

ApiKey输入密码

  输入密码后点击Submit后显示如下,鼠标选中文字后复制并保存(注意不要点击Revoke it,这是撤销这个ApiKey的意思):

复制密码

配置项目gradle和local.properties

  我们上传项目到Jcenter时使用Gradle的task自动完成,所以只需要配置好gradle一句话就可以完成上传了,下面是项目中的配置。
  正式开始之前我们上一张图,这里以AndServer为例:

项目结构图

(一)配置项目的gradle文件

  我们项目一般会有多个gradle配置文件,第一步要配置的是项目的gradle,而不是module/library的gradle,也就是上图[项目的gradle]标注的文件,你的项目中应该只有dependencies节点下的代码不一样:
  这是修改之前的:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
    }
}
allprojects {
    repositories {
        jcenter()
    }
}
task clean(type: Delete) {
    delete rootProject.buildDir
}

  这是修改之后的:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
        // 添加下面两行代码即可。
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

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

No service of type Factory available in ProjectScopeServices.错误解决:
https://code.google.com/p/android/issues/detail?id=219692

特别注意,如果你的AndroidStuio更新到了2.1.3,也就是你引用的Gradle插件是2.1.3:

classpath 'com.android.tools.build:gradle:2.1.3'

这时候如果上面的android-maven-gradle-plugin是1.3时会发生这个错误No service of type Factory available in ProjectScopeServices.,解决方法是把android-maven-gradle-plugin版本改为1.4.1:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.3'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

(二)配置要上传的library/module的gradle文件

  第二步要配置的是要上传的module的gradle,而不是整个项目的gradle,也就是上图[library的gradle]标注的文件:
  这是修改之前的:

apply plugin: 'com.android.library'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
//      applicationId "com.yanzhenjie.andserver.sample" // 这一行要删除,因为library不允许有applicationId。
       minSdkVersion 8
        targetSdkVersion 23
        versionCode 1
        versionName '1.0.1'
    }
}
dependencies {
    // 如果你的library有依赖别的jar,这里要把jar依赖进来。
    compile fileTree(dir: 'libs', includes: ['*.jar'])
}

  这是修改之后的:

apply plugin: 'com.android.library'
// 这里添加下面两行代码。
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"
    resourcePrefix "andserver_res_"

    defaultConfig {
     // applicationId "com.yanzhenjie.andserver.sample" // 这一行要删除,因为library不允许有applicationId。
        minSdkVersion 8
        targetSdkVersion 23
        versionCode 1
        versionName '1.0.1'
    }
}
dependencies {
    // 如果你的library有依赖别的jar,这里要把jar依赖进来。
    compile fileTree(dir: 'libs', includes: ['*.jar'])
}

// 项目引用的版本号,比如compile 'com.yanzhenjie:andserver:1.0.1'中的1.0.1就是这里配置的。
version = "1.0.1"

// 定义两个链接,下面会用到。
def siteUrl = 'https://github.com/yanzhenjie/AndServer' // 项目主页。
def gitUrl = 'git@github.com:yanzhenjie/AndServer.git' // Git仓库的url。

// 唯一包名,比如compile 'com.yanzhenjie:andserver:1.0.1'中的com.yanzhenjie就是这里配置的。
group = "com.yanzhenjie"
install {
    repositories.mavenInstaller {
        // 生成pom.xml和参数
        pom {
            project {
                packaging 'aar'
                // 项目描述,复制我的话,这里需要修改。
                name 'AndServer For Android'// 可选,项目名称。
                description 'The Android build the framework of the Http server.'// 可选,项目描述。
                url siteUrl // 项目主页,这里是引用上面定义好。

                // 软件开源协议,现在一般都是Apache License2.0吧,复制我的,这里不需要修改。
               licenses {
                    license {
                        name 'The Apache Software License, Version 2.0'
                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }

                //填写开发者基本信息,复制我的,这里需要修改。
                developers {
                    developer {
                        id 'yanzhenjie' // 开发者的id。
                        name 'yanzhenjie' // 开发者名字。
                        email 'smallajax@foxmail.com' // 开发者邮箱。
                    }
                }

                // SCM,复制我的,这里不需要修改。
                scm {
                    connection gitUrl // Git仓库地址。
                    developerConnection gitUrl // Git仓库地址。
                    url siteUrl // 项目主页。
                }
            }
        }
    }
}
// 生成jar包的task,不需要修改。
task sourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier = 'sources'
}
// 生成jarDoc的task,不需要修改。
task javadoc(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
    // destinationDir = file("../javadoc/")
    failOnError false // 忽略注释语法错误,如果用jdk1.8你的注释写的不规范就编译不过。
}
// 生成javaDoc的jar,不需要修改。
task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}
artifacts {
    archives javadocJar
    archives sourcesJar
}

// 这里是读取Bintray相关的信息,我们上传项目到github上的时候会把gradle文件传上去,所以不要把帐号密码的信息直接写在这里,写在local.properties中,这里动态读取。
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
bintray {
    user = properties.getProperty("bintray.user") // Bintray的用户名。
    key = properties.getProperty("bintray.apikey") // Bintray刚才保存的ApiKey。

    configurations = ['archives']
    pkg {
        repo = "maven"  // 上传到maven库。(这里要特别注意,如果写了maven报404错误,请在bintray创建一个仓库,这里填改成你创建的仓库的名字,如何创建请看下图。)
        name = "andserver"  // 发布到Bintray上的项目名字,这里的名字不是compile 'com.yanzhenjie:andserver:1.0.1'中的andserver。
        userOrg = 'bintray_user' // Bintray的用户名,2016年11月更新。
        websiteUrl = siteUrl
        vcsUrl = gitUrl
        licenses = ["Apache-2.0"]
        publish = true // 是否是公开项目。
    }
}

如何创建自己的仓库(见上方repo说明):
这里写图片描述

上面有两个特别的地方要注意:

  1. 我们上传的开源项目一般会托管到github上,我们上传的时候会把项目和module的gradle文件传上去,所以不要把帐号密码的信息直接写在gradle文件中,而我们的local.properties文件一般不会上传(没经验的人可能会传),所以我们把用户隐私信息配置到local.properties, 在gradle中动态读取,如何读取,在上面最后一个代码块中有介绍。
  2. 我们看到在module/library的gradle中pkg下的name="andserver",这个名字是我们项目在Bintray中的名字,所以这个andserver不是compile ‘com.yanzhenjie:andserver:1.0.1’的andserver,那么compile中的andserver哪里配置呢?compile的library名称就是library/module的名称,如下图所示:

compile的模块名称

(三)在local.properties中为module/libraray配置用户隐私信息

  我们会在local.properties中配置很多变量,别的地方动态引用或者读取,这样就可以做到修改一个地方,其它地方都可以不用改了:

sdk.dir=你的sdk路径
# 其实你只需要添加下面两行,第一个填你的用户名,比如我的是yolanda。
bintray.user=yolanda
bintray.apikey=fa************************5a

  注意下我这里为了不泄漏我的ApiKey,就用*代替了,你的要写你的完整的ApiKey喔。

上传项目到Jcenter

  准备工作都做完啦,最后一步就是上传操作了,点击AndroidStudio底部的Terminal,观察下Terminal显示的路径是否是你当前项目的root。

  1. 这里如果你系统配置了gradle的用户环境,输入gradle install,如果没有配置gradle用户环境,输入gradlew install,如果没有问题,最终你会看到BUILD SUCCESSFUL
  2. 如果你看到了生成javadoc时编译不过,那么要看下在gradle中task javadoc下有没有failOnError false这句话,在刚才编写gradle时提示过了。如果加了这句而你的javadoc写的不规范会有警告,你不用鸟它。
  3. 最后一步,运行gradle install后看到BUILD SUCCESSFUL后,再输入上传命令gradle bintrayUpload,等一分钟左右就执行完了,会提示SUCCESSFUL
  4. 浏览器https://bintray.com/后会看到你的项目。

Bintray项目展示

  上传完成咯,但是别着急喔,你会发现在项目gradle中依赖如下代码后依赖失败:

'compile '包名:模块名:1.0.0'

  原因是我们项目上传完成后还需要Bintray的管理员审核,所以在刚才项目页面点击进去查看详情,点击Add to Jcetner

点击Add to Jcenter

  之后的页面中填写项目信息,交给Bintray管理员审核:

提交审核

  审核蛮快的,我都是晚上提交,第二天早上在公交车上就收到审核通过的邮件了,审核通过就可以用gradle compile依赖咯,祝你好运喔。

版权声明:转载请注明本文转自严振杰的博客: http://blog.csdn.net/yanzhenjie1003

以上是关于AndroidStuio快速发布开源项目到Jcenter/Bintray的主要内容,如果未能解决你的问题,请参考以下文章

如何将你的项目快速迁移到 GitCode?

.NET 5开源项目:b站账号快速升级到 Lv6,每天自动签到,观看,分享,投币视频!

腾讯,排行前10的开源项目

解读|TARS开源项目发布Go语言版本

稳定快速免费的前端开源项目网站

github贡献开源项目