通过AndroidStudio发布Android Library到Jcenter[超详细]

这篇文章很长

如果已经对jcenter,maven有了一些概念,可以直接看我的另外一篇精简文章:
快速发布Abdroid Library到JCenter[精简]

另:也可以直接看具体应用实例:
https://github.com/andforce/AsyncOkHttp


开始之前先明白几个概念

maven

Maven是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具
换句话说,Maven是通过pom.xml文件的配置获取jar包的,从而省去了手动拷贝jar包到project的麻烦。

gradle

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML
翻译一下,gradle是通过Groovy语法,获取library,对Android来说不用自己拷贝jar或者aar了。

从哪里获取?

上面说的maven和gradle都是通过配置,然后自动获取,那么问题来了:从哪里获取?答案:代码仓库
就Android开发来说,目前两个比较著名的仓库是 mavenCentraljcenter

mavenCentral和jcenter

mavenCentral被称为maven的权威中央仓库,但是上传library极其复杂繁琐,这也是被google换掉的原因之一;
其实从名字上看,mavenCentral有点让人困惑,会让人感觉这个仓库只支持maven的配置方式。
其实,无论是mavenCentral还是jcenter都支持maven和gradle的配置方式。
jcenter托管在 https://bintray.com ,也可以说是这个网站在维护管理jcenter仓库;

mavenCentral()被google默认替换成jcenter()

在Android Studio早期版本中,如果我们创建一个Project,给我们的默认repositorymavenCentral()

buildscript {
    repositories {
        mavenCentral() //现在已经被替换成了jcenter()
    }
}
.
.
.
allprojects {
    repositories {
        mavenCentral() //现在已经被替换成了jcenter()
    }
}

之后我们就可以用简单的配置,来使用library了:

implementation 'com.google.code.gson:gson:2.8.5'

正式开始


如果你读完上面的文字,我想你已经明白了,我们为什么选择上传到jcener了:Android Studio现在默认的配置的是jcenter,原因是mavenCentral上传过程太复杂。

注册bintray.com帐号

由于jcenter是托管在bintray.com上的,因此我们只要有bintray的帐号,就可以管理我们自己上传的library了。
注册这一步就不说了,没什么特别的,按照要求填写就行了。

1:添加一个新的Repository,当然如果你不想添加,bintray默认会有一个名字是maven的Repository(不想添加可跳过次步骤)

image.png

填写相关信息:

image.png

2:在Repository中添加一个Package

image.png
image.png
image.png

3:获取bintray.user和bintray.apikey,下面使用插件上传要用到

bintray.user 就是你注册时候填写的用户名,这没什么好说的。
下面主要说一下如何获取bintray.apikey:


image.png
image.png
image.png
image.png

到此,我们bintray上的配置就完全结束了:

4:编写要上传的Library的代码

使用Android Studio创建一个工程,这个工程其实的作用是为了上传和测试你自己要上传的Library。


image.png

图中的asyncokhttp其实就是一个module(Android Library),这个库其实就是封装了一下okhttp3,让其能在主线程直接调用网络请求。
看一下asyncokhttp的依赖:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    // 省略了一些不重要的信息
    //这里依赖okhttp3
    implementation 'com.squareup.okhttp3:okhttp:3.12.0'
}

5:使用插件开始上传

在编写测试完毕你的代码之后,我们就可以使用插件开始上传你的库了
这里用到的插件一共有两个:

1:maven插件,主要用来帮助生成和打包maven所需要上传的文件
apply plugin: 'com.github.dcendents.android-maven'
2:bintray插件,主要用来打包和上传库到bintray网站
apply plugin: 'com.jfrog.bintray'

在Project的build.gradle(根目录)中添加:

buildscript {
    repositories {
        google()
        jcenter()
        
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.1'
        
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files

        // 下面两行是新添加的
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
    }
}

在Project的的local.properties中添加上面获取到的bintray.user 和bintray.apikey

image.png

在Moudle的目录下创建3个文件:

image.png

1:android-maven-install.grdle主要是使用apply plugin: 'com.github.dcendents.android-maven'插件,完成maven相关文件的生成与打包。
内容:

apply plugin: 'com.github.dcendents.android-maven'

install {
    repositories.mavenInstaller {
        // This generates POM.xml with proper parameters
        pom {
            project {
                packaging libraryPackaging
                groupId publishedGroupId
                artifactId artifact

                // Add your description here
                name libraryName
                description libraryDesc
                url websiteUrl

                // Set your license
                licenses {
                    license {
                        name licenseName
                        url licenseUrl
                    }
                }
                developers {
                    developer {
                        id developerId
                        name developerName
                        email developerEmail
                    }
                }
                scm {
                    connection websiteUrl
                    developerConnection websiteUrl
                    url websiteUrl

                }
            }
        }
    }
}

2:android-tasks.gradle主要是生成javadoc.jar和sorce.jar:

task javadoc(type: Javadoc) {
    options.encoding = "utf-8"
    source = android.sourceSets.main.java.srcDirs
    classpath += files(android.bootClasspath)

    options {
        //links "http://docs.oracle.com/javase/7/docs/api/"
        linksOffline "https://developer.android.com/reference","${android.sdkDirectory}/docs/reference"
        encoding = "UTF-8"
    }
    exclude '**/BuildConfig.java'
    exclude '**/R.java'

    android.libraryVariants.all { variant ->
        variant.javaCompileProvider.configure{
            javadoc.classpath += files(it.classpath.files)
        }
    }

}

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

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

artifacts {
    archives javadocJar
    archives sourcesJar
}

3:bintray.gradle主要是用apply plugin: 'com.jfrog.bintray'完成文件的打包上传到bintray.com
内容:

apply plugin: 'com.jfrog.bintray'

configurations {
    optional
    compile.extendsFrom optional
}

def siteUrl = project.websiteUrl
def gitUrl = project.vcsUrl
def libName = project.name

group = project.publishedGroupId
version = project.versionName

Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())

bintray {
    user = properties.getProperty("bintray.user")
    key = properties.getProperty("bintray.apikey")
    configurations = ['archives']

    pkg {
        repo = project.bintrayRepo  //发布到Bintray的maven库
        name = libName  //发布到Bintray上的项目名字
        desc = project.libraryDesc
        override = true
        publish = true
        publicDownloadNumbers = true
        websiteUrl = siteUrl
        issueTrackerUrl = project.issueTrackerUrl
        vcsUrl = gitUrl
        licenses = [project.licenseName]
        publish = true
        //attributes = ['gradle-plugin': 'com.use.less:com.use.less.gradle:gradle-useless-plugin']
        version {
            desc = project.libraryVersionDesc
            released = new Date()
            gpg {
                sign = true //Determines whether to GPG sign the files. The default is false
                passphrase = properties.getProperty("bintray.gpg.password")
                //Optional. The passphrase for GPG signing'
            }
        }
    }
}

6:配置Library的相关信息

在module的build.gradle的最后添加:

ext {
    libraryPackaging = 'aar'                                            //上传aar形式的打包文件

    // jcenter
    bintrayRepo = "network"                                             // 你上传的位于bintray中的Repository名称,如果没有创建会有一个叫maven的
    name = 'asyncokhttp'                                                // 必须和library module的名字相同
    libraryDesc = 'A OkHttp Library'
    publishedGroupId = 'org.zarroboogs.http.asyncokhttp'                // 填写groupId, 一般是包名,比如:com.android.support
    versionName = '1.0.1'                                               // 版本号,比如:22.2.1
    websiteUrl = 'https://github.com/andforce/AsyncOkHttp'              // 可以填写github上的库地址.
    issueTrackerUrl = 'https://github.com/andforce/AsyncOkHttp/issues'  // 可以填写github库的issue地址.
    vcsUrl = 'https://github.com/andforce/AsyncOkHttp.git'              // 可以填写github上库的地址.
    licenseName = "Apache-2.0"
    libraryVersionDesc = 'version descriotion'

    // maven
    artifact = 'asyncokhttp'                                            // 必须和library module的名字相同
    libraryName = 'asyncokhttp'
    developerId = 'anforce'
    developerName = 'andforce'
    developerEmail = '86118@163.com'
    licenseName = 'The Apache Software License, Version 2.0'
    licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt'

}
apply from: 'android-maven-install.gradle'
apply from: 'android-tasks.gradle'
apply from: 'bintray.gradle'
7:运行命令上传发布的你的Library

在Project的根目录:

#编译
./gradlew install

#上传
./gradlw bintrayUpload

8:手动提交到jcenter

在运行上面的命令之后,我们就可以在bintray的Repo中看到刚刚上传的Library 了。

image.png

但是这个时候,还没有正式发布到jcenter,我需要用手主动提交一下:


image.png

点击Add to JCenter之后,会有一个审核时间,大约24小时后,就可以在JCenter上看到了。

简化


从上面教程我们可以看到,每次都需要创建和引用3个文件,还是挺麻烦的。

apply from: 'android-maven-install.gradle'
apply from: 'android-tasks.gradle'
apply from: 'bintray.gradle'

为了引用方便,可以把上面三个gradle内容放到一个文件中,这样引用一行,效果和上面引用3个文件是一样的

//apply from: 'android-maven-install.gradle
//apply from: 'android-tasks.gradle'
///apply from: 'bintray.gradle'
apply from: 'jcenter.gradle'

这样每次创建一个文件就好了。

其实还能进一步简化:
为了不需要每次都创建这个文件,还可以把这个配置文件放到网络上:
https://github.com/andforce/release-android-lib-to-jcenter
https://raw.githubusercontent.com/andforce/release-android-lib-to-jcenter/master/jcenter.gradle
所以最终,我们的引用方式变成了这样

apply from: 'https://raw.githubusercontent.com/andforce/release-android-lib-to-jcenter/master/jcenter.gradle'

最后,之前编译和上传的命令,也可以合并成一个了:

#编译
#./gradlew install
#上传
#./gradlw bintrayUpload

# 上面的合并成一条
./gradlew jcenter

应用实例

https://github.com/andforce/AsyncOkHttp

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 175,490评论 5 419
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 74,060评论 2 335
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 124,407评论 0 291
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 47,741评论 0 248
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 56,543评论 3 329
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 43,040评论 1 246
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 34,107评论 3 358
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 32,646评论 0 229
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 36,694评论 1 271
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 32,398评论 2 279
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 33,987评论 1 288
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 30,097评论 3 285
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 35,298评论 3 282
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 27,278评论 0 14
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 28,413评论 1 232
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 38,397评论 2 309
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 38,099评论 2 314

推荐阅读更多精彩内容