AndroidStudio发布项目到Maven(JCenter)

作者: 撸代码的皇太极 | 来源:发表于2019-04-25 14:58 被阅读5次

    写在前面:

        之前在写项目时,喜欢将重复的功能或者自定义控件封装到公用的模块中,方便其他项目共用。当项目越来越多,很多项目都依赖了这个公用模块时,其中某一个项目中对公用模块中的代码进行了修改,此时其他依赖该公共模块的项目不得不做出修改或者同步代码,是不是相当麻烦?因此就不得不将公用模块打包成.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 ,fasle:只是构建你的项目,不会上传
    

    如果你在编译中遇到问题,请前往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发布流程完毕,版本更新时只需要更改配置版本号重新发布即可。祝君耍的愉快~~

    相关文章

      网友评论

        本文标题:AndroidStudio发布项目到Maven(JCenter)

        本文链接:https://www.haomeiwen.com/subject/vtkzgqtx.html