AndroidStudio发布项目到Maven(JCenter)

写在前面:

    之前在写项目时,喜欢将重复的功能或者自定义控件封装到公用的模块中,方便其他项目共用。当项目越来越多,很多项目都依赖了这个公用模块时,其中某一个项目中对公用模块中的代码进行了修改,此时其他依赖该公共模块的项目不得不做出修改或者同步代码,是不是相当麻烦?因此就不得不将公用模块打包成.aar文件(不清楚.aar文件的童鞋请自行Google或Baidu),公开或放在私服提供给各个项目使用。这里我们就随着前辈们的脚步来学习如何将项目模块发布至Maven仓库。真正做到只需一处修改,四处升级即可。本文将介绍发布到Maven的三种方式。最终将项目发布远程Maven仓库后添加至JCenter,供其他人使用你的公共库。

1:Maven的定义:

简单来说,Maven是项目(Software Project)管理工具。对于maven来说,一个软件工程的唯一标识是由开发者(groupId)、生成物(artifactId)、版本(version) 共同决定的。每个工程都有一个打包类型,可以是jar, aar,war, ear 或 pom,打包类型决定了工程最终产物的类型,其中pom类型用于构件多模块工程。其内部工作机制是通过解析pom.xml文件中的配置获取jar包或aar资源地址自动将资源download到Peoject中,省去了手动下载到本地的繁琐过程。

2:Maven的存储位置:

远程Maven仓库是存储服务器的物理空间上,本文介绍是将Maven发布到第三方OSS服务商Bintray的存储空间上。

发布代码到Maven的三种方式

一:发布到本地Maven

1:uploadArchives配置和Task生成

在要发布的模块build.gradle中配置uploadArchives属性,示例代码:

//添加这一行,告诉gradle应用到项目中
apply plugin: 'maven'
//配置模块未本地Maven仓库
uploadArchives{
    repositories.mavenDeployer{
        // 配置本地仓库路径,这里是项目的根目录下的maven目录中
        repository(url: uri('../maven'))
        // 唯一标识 一般为模块包名 也可其他
        pom.groupId = "com.android.imusic.player.lib"
        // 项目名称(一般为模块名称 也可其他
        pom.artifactId = "music-player-lib"
        // 发布的版本号
        pom.version = "1.0.0"
    }
}
uploadArchives配置截图图示

配置后Sync Now一把,Studio编辑器右上角Gradle中你要发布的模块下会多出一个upload目录,目录中有个uploadArchives任务脚本,这个脚本就是将库发布到本地或私服Maven仓库的Task。

2:执行uploadArchives任务

点击如图所示的uploadArchives


uploadArchives在Studio中图示

uploadArchives有两种运行方法:1:双击运行。2:在AndroidStudio自带的Terminal中执行 gradlew uploadArchives 命令运行。根据喜好选取一种即可,开始任务后等待编译完成。


编译到Maven成功图示

编译完成后在你项目的根目录会生成一个maven目录,在目录maven->com.android.imusic.ib->music-player-lib->1.0.0中会有个music-player-lib.aar 文件,这个文件就是打包签名好的库文件。
模块编译到Maven完成图示

3:应用music-player-lib.aar库文件到项目中

  • 3.1:项目根目录build.gradle配置Maven
    在你的项目中根目录下的build.gradle中配置如下代码:
allprojects {
    repositories {
        google()
        jcenter()
        //本地Maven仓库地址,取决于你的磁盘目录
        maven {
            url 'file://D://AndroidStudioProjects//IMusic//maven'
        }
    }
}
  • 3.2:app中的build.gradle配置
    在你想要依赖.aar的模块中的build.gradle中配置如下代码:
//应用这个依赖,这里填写刚才配置的包名+库名
implementation 'com.android.imusic.lib:music-player-lib:1.0.0'
  • 或者你可以不配置本地仓库,直接将.aar文件复制到你的app模块中直接使用,配置代码如下:
//在你的app中的build.gradle中配置
android {
        repositories {
            flatDir {
                dirs 'libs'
            }
        }
    }
//添加依赖
implementation(name: 'music-player-lib-1.0.0', ext: 'aar')

点击Sync Now等待完成后发布依赖到本地Maven就成功啦!在发布到本地Maven前你应该要校验混淆开启的情况噢~免得他人依赖你的项目时掉坑里去了。发布到本地Maven固然方便,但是公司项目团队人数较多时,将模块打包成.aar文件后复制到项目多少有点不方便,比如所A程序员的本地Maven路径是在D盘,而B程序员的Maven路径又在E盘,这样同步代码改来改去着实难受,所以接下来就介绍适应公司内部团队多人开发的场景,即将代码发布至局域网仓库。

二:发布到局域网Maven

局域网部署需要用到私服部署,这里跟随前辈脚步介绍使用Nexus来搭建部署局域网Maven仓库。

1:安装部署Nexus(这里用nexus-2.14.2-01版本演示)

点此前往下载nexus-2.14.2-01
下载解压后会看到目录下下面几个文件夹

nexus目录文件预览图示

目录下批处理脚本释义:
console-nexus.bat--->常规安装Nexus服务
install-nexus--->启动开机自启动Nexus服务
start-nexus.bat--->启动Nexus服务
stop-nexus.bat--->停止Nexus服务
uninstall-nexus.bat--->卸载Nexus组件
wrapper.exe--->桌面程序

  • 鼠标右键"console-nexus.bat"以管理员身份运行,等待CMD创建安装完成后在浏览器输入:http://localhost:8081/nexus
    安装和成功启动后是这样的
    Nexus启动默认界面图示

2:Nexus仓库配置

  • 2.1:点击右上角Log In,登录默认账号,默认账号:admin 密码:admin123


    Maven登录图示
  • 2.2:修改默认密码


    Maven账号默认密码修改图示

    按照步骤修改密码即可,如果需要修改默认的端口号,修根目录下的conf-nexus.properties文件中的application-port=8081一栏,将8081替换你指定的端口号:、


    Nexus端口号修改图示

    配置就绪后,准备发布,发布后你的项目路径如图所示:
    Nexus项目存储Maven管理目录

3:准备发布

  • 3.1:模块的build.gradle配置
apply plugin: 'com.android.library'
//应用到Maven
apply plugin: 'maven'

android {
    compileSdkVersion 26
    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
}

//打包main目录下代码和资源的 task
task androidSourcesJar(type: Jar) {
    classifier = 'sources'
    from android.sourceSets.main.java.srcDirs
}
//配置需要上传到maven仓库的文件
artifacts {
    archives androidSourcesJar
}
//上传到Maven仓库的task
uploadArchives {
    repositories {
        mavenDeployer {
            //指定maven的仓库url,IP+端口+目录
            repository(url: "http://localhost:8081/nexus/content/repositories/releases/") {
                //填写你的Nexus的账号密码
                authentication(userName: "admin", password: "123456")
            }
            // 唯一标识 一般为模块包名 也可其他
            pom.groupId = "com.android.imusic.lib"
            // 项目名称(一般为模块名称 也可其他
            pom.artifactId = "music-player-lib"
            // 发布的版本号
            pom.version = "1.0.0"
        }
    }
}
  • 3.2:执行uploadArchives,将项目发布到Nexus
    执行uploadArchives或者使用Studio自带的Terminal中执行 gradlew uploadArchives 命令开始构建运行。等待结束后,浏览器打开Nexus,查看Repositories->Releases 目录。成功发布后的代码库模块目录如图所示:
    发布代码到Nexus成功图示

4:使用局域网Nexus存储库代码库

  • 4.1:根build.gradle配置修改
    在你的项目中的根build.gradle中添加如下代码
allprojects {
    repositories {
        google()
        jcenter()
        //本地Maven仓库地址,取决于你的磁盘目录
        maven {
            //这里本地不再使用,改用下面的局域网的路径
            //url 'file://D://AndroidStudioProjects//IMusic//maven',
            //添加本地仓库URL
            url 'http://localhost:8081/nexus/content/repositories/releases/'
        }
    }
}
  • 4.2:app模块中build.gradle配置修改
    在你的项目中要使用代码库的模块中的build.gradle做如下修改:
dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    //和刚才使用本地Maven仓库一致:包名+库名
    implementation 'com.android.imusic.lib:music-player-lib:1.0.0'

到此,发布代码到本地仓库到此结束了。但是随之又来了一个问题,局域网仓库对公司团队来说固然是好,但是你开发的模块很牛逼的时候,别人要用你的模块时怎么办?这个时候就需要将模块发布至外网仓库,即发布代码至JCenter。

三:发布到外网Maven

发布到外网Maven,本问介绍发布到JCenter上。在早期的AndroidStudio版本中,Google默认使用的仓库是mavenCentral,但由于发布流程太复杂(前辈们是这样分析的,不知道对不对),后来改用默认仓库是JCenter,说了这么久还没介绍JCenter是什么?简单来说JCenter是Bintray其下的一个分区仓库,代码托管的存储空间。那既然JCenter是属于Bintray旗下的,那就首先得从Bintray开始。

1:Bintray账号准备

Bintray是一家OSS服务商,类似国内的阿里云OSS。要将代码发布之JCenter,必须先有Bintray账号和分区目录。感兴趣可以去看下AndroidStudio的Bintray库在Giuhub中的项目:Bintray-Github。注册账号我们注册个人账号即可。前往Bintray官网个人账号注册

  • 注意:1.注册账号最好注册个人的,不然企业账号没有add To Jcenter功能,需要收费。2:注册的邮箱一定要使用国外的邮箱,不然注册没反应。


    Bintray账号注册图示

2:为Bintray账号添加组织

添加组织有两种方式:1:创建Bintray组织。2:导入第三方托管平台组织。

2.1:创建Bintray组织

在bintray主页鼠标放至头像弹窗的Menu框中点击createOrganization->界面跳转后点击->Create new organization创建新的组织。


创建组织入口图示

按照提示填写组织基本信息提交即可。


Bintray组织资料图示
2.2:导入第三方平台组织

Bintray支持第三方托管平台的组织导入,但目前为止只支持从Github导入组织到Bintray。

  • 2.2.1:导入Github组织
    在bintray主页鼠标放至头像弹窗的Menu框中点击createOrganization->再点击Import from GitHub导入Github账号组织。第一次导入官方会给出操作流程图,如下:


    Bintray导入Github组织流程图示
  • 2.2.1.1 前往Github设置中心
    点击图中标记的Account Setting page,前往Github设置中心界面。跳转至Github的设置中心后依次点击左侧的Applications,展开界面后点击右侧的Authorized OAuth Apps,展开列表就可看到支持列表中有bintray了。


    授权设置及操作图示
  • 2.2.1.2 授权Bintray访问Github账户的权限
    点击Bintray一栏中的Grant,授予Bintray访问Github账户的权限。


    Github授权Bintray访问权限图示
  • 2.2.2:填写第三方组织在Bintray中的基本信息
    授予访问权限后,再次走导入Github组织流程,选择你的组织后,根据界面提示填写基本信息提交即可。

3:创建Bintray存储分区

点击Add New Repository创建存储分区


创建存储分区入口图示

按图中所示,填写分区基本信息


填写分区基本信息图示

创建成功后是这样的
存储分区建成功

4:模块build.gradle配置

4.1:在你项目的根build.gradle中配置bintray环境依赖
buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
        //添加bintray环境
        classpath 'com.novoda:bintray-release:0.8.1'
    }
}
4.2:在你要发布的模块build.gradle中配置如下配置
apply plugin: 'com.novoda.bintray-release'

//推送到Bintray配置
publish {
    //你的账户bintray下某个组织id
    userOrg = 'xxxxxx'
    //Maven仓库下库的包名,一本与包名相同
    groupId = 'xxx.xxx.xxx'
    //项目名称
    artifactId = 'xxx'
    //版本号
    publishVersion = '1.0.0'
    //项目介绍,可以不写
    desc = 'xxx'
    //项目主页,可以不写
    website = 'xxx'
}

最终的依赖地址是compile '仓库包名:项目名称:版本号'

5:编译并发布到Bintray

5.1:获取Bintray API Key

在你的Bintray主页点击右上角头像 右上角用户名–>Edit Your Profile -> API Key –>输入密码–>Submit–>Show。复制API key备用。


Bintray获取API KEY图示
5.2:运行发布命令

在AndroidStudio编译器自带的Terminal中输入命令:

gradlew clean build bintrayUpload -PbintrayUser=BINTRAY_USERNAME -PbintrayKey=BINTRAY_KEY -PdryRun=false
//BINTRAY_USERNAME替换为你的Bintray用户名,BINTRAY_KEY替换为你刚才获取的Bintray API KEY
//PdryRun释义:false:编译且将你的项目上传至Bintray ,true:只是构建你的项目,不会上传

如果你在编译中遇到问题,请前往AndroidStudio发布项目到Bintray遇到的错误及解决
开始构建后耐心等待,可能会因为socket出现多次上传失败,重试即可。直到出现这个表示上传成功。

发布到Bintray成功

上传完成后可在你的主页或者组织下查看
上传到Bintray成功图示

6:添加至JCenter

点击右下角add to JCenter,确认后点击send提交,等待审核通过。(白天提交会到晚上才审核通过,因为有时差,在他们上班时间提交,会立即审核通过)


添加项目至JCenter图示

send后,等待审核通过,通过后即可在外网使用你的库作为依赖了。


发送代码到JCenter信息填写图示

这个是Bintray回复的站内通知
添加至JCenter通过图示

7:项目引用JCenter库

7.1未添加至JCenter引用:
  • 7.1.1:在根build.gradle中配置如下代码
allprojects {
    repositories {
        //bintray环境
        maven { url 'https://dl.bintray.com/novoda-oss/snapshots/' }
        //你的maven路径
        maven { url 'https://dl.bintray.com/你的id/maven' }
    }
}
  • 7.1.2:在app模块中的build.gradle中配置如下代码
dependencies {
    //添加你的项目依赖地址,如下规则
    implementation '仓库包名:项目名称:版本号'
    //例如我的:
    //implementation 'com.imusic.player:music-player:1.0.0'
}
7.2:已添加至JCenter引用:
  • 7.2.1:在根build.gradle中配置如下代码
allprojects {
    repositories {
        //bintray环境
        maven { url 'https://dl.bintray.com/novoda-oss/snapshots/' }
        //添加支持JCenter即可
        jcenter()
    }
}
  • 7.2.2:在app模块中的build.gradle中配置如下代码
dependencies {
    //添加你的项目依赖地址,如下规则 
    implementation '仓库包名:项目名称:版本号'
    //例如我的:
    //implementation 'com.imusic.player:music-player:1.0.0'
}

至此,全部Maven及JCenter发布流程完毕,版本更新时只需要更改配置版本号重新发布即可。祝君耍的愉快~~

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

推荐阅读更多精彩内容